在boost :: shared_ptr运算符bool()上旋转时需要C++ volatile吗?

Jar*_*edC 1 c++ multithreading boost volatile shared-ptr

可能重复:
何时使用volatile多线程?

我有两个引用相同的线程boost::shared_ptr:

boost::shared_ptr<Widget> shared;
Run Code Online (Sandbox Code Playgroud)

在线程正在旋转,等待另一个线程重置boost::shared_ptr:

while(shared)
   boost::thread::yield();
Run Code Online (Sandbox Code Playgroud)

在某些时候,另一个线程会调用:

shared.reset();
Run Code Online (Sandbox Code Playgroud)

我的问题是我是否需要声明共享指针volatile以防止编译器优化shared.operator bool()对循环的调用并且从不检测更改?我知道如果我只是循环变量,等待它达到0我需要volatile,但我不确定是否boost::shared_ptr以这样的方式实现它是不必要的.

编辑:我完全清楚条件变量可以用来以不同的方式解决这个问题.但在这种情况下,繁忙的循环非常罕见,并且争用条件变量的锁定是我们宁愿不会产生的开销.

Kar*_*tan 7

咆哮1:

该代码可能不会按照您的想法执行.当您编写类似的代码时,您将在代码中引入数据竞争. 这几乎肯定是一个错误,会导致您的程序无法确定地失败.

数据结构(包括shared_ptr)通常不打算同时访问.不要在多个线程中同时修改相同的结构.这可能会破坏结构.不要在一个线程中修改它并在另一个线程中读取它.读者可以看到不一致的数据. 可能多个线程可以同时读取它.

如果您认为您确实想要执行上述某些操作,请查看数据结构是否允许在标题为"线程安全"的部分中介绍其中某些行为.如果确实允许它们,请再次查看您的性能是否真的需要它,然后再使用它.(关于shared_ptr的文档不允许你正在做的事情.)

咆哮2:

现在,对于更高级别的问题,您可能不应该通过等待指针设置为NULL来进行线程同步.实际上,将条件变量,障碍或期货视为让一个线程等到另一个线程完成某事的方式.它是一个更好的界面,无论谁看下你的代码(包括你在6个月内),都会感谢你.

我知道你担心真正同步的性能成本.别担心这个.没关系.如果您担心锁争用,请使用障碍或期货,这些障碍或期货没有大的共享锁来竞争.

警告:有时间编写代码可以不惜一切代价避免锁定.但除非您正在查看分析器数据,表明您的同步操作对目标工作负载来说太慢,否则现在不是时候了.

咆哮3:

我希望shared你的例子是全球性的.否则,您有多个线程,其本地引用shared_ptr指向您感兴趣的真实对象.它有点挫败了引用计数指针的目的.请告诉我这是全球性的.