gpt4 book ai didi

c++ - 任何实现多线程访问值而不需要读者锁定的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:10 26 4
gpt4 key购买 nike

我正在尝试实现一个简约的同步机制,其中有一个对象包含一些类型的值 Foo , 这个Foo可能是一个重量级的类型,但很少改变它的值(value)。可以从多个线程访问该对象,几乎 100% 读取。

我正在尝试想出一种方法来使这项工作对读者没有任何锁定要求。我的第一次尝试是让我的类(class)包含 Foo通过 std::shared_ptr<Foo> 类型的共享指针成员.读取操作将简单地复制构造共享指针,取消引用它,然后使用该值的“版本”来做他们想做的任何事情。

写操作应该将他们的更改应用到 Foo 的新拷贝中,一旦完成,尝试替换当前版本的 Foo用一个新的。

我意识到这对于 shared_ptr<Foo> 是不可能的因为复制构造函数可能会与试图更新它的东西进入读/写竞争,并读取损坏的值。我可以使用 boost::intrusive_ptr<Foo> 解决这个问题使用原子计数器并使用 CAS 操作进行版本更新,但仍然存在我无法摆脱的竞争条件:读取器可以在调用 intrusive_ptr_add_ref 之前暂停在即将被另一个将计数降低到 0 的线程销毁的实例上。

似乎这种方法从根本上打破了某些东西。

有没有什么方法可以不依赖关键部分、读者/作者锁或成熟的 RCU(读取-复制-更新)来实现这一点?也许我错过了一些简单的东西。平台为Win7+/x86/x64。

最佳答案

解决办法是先有一个本地std::shared_ptr<Foo>其中有新的 Foo并将其分配给全局 std::shared_ptr通过atomic assignment方法。澄清一下:不要使用简单的赋值。从链接中,您可以使用:

atomic_store( &global_ptr, std::make_shared<Foo>(...) );

关于c++ - 任何实现多线程访问值而不需要读者锁定的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com