可以使用原子<bool>进行多线程同步比事件
就像在C ++ 11中一样,它已经被导入原子,就像我们在旧代码中所知道的那样,它使用windows事件(CreateEvent / SetEvent)进行线程同步。 伪代码如下。
线程A:
while(true)
{
if(check event is set)
break;
else
do stuff
}
线程B:
SetEvent() //ask thread A stop.
我想知道在这种情况下。 是否可以使用更简单的原子,如下所示,有什么原子布尔不能取代事件? 提前致谢!
std::atomic<bool> bFlag = false;
线程A:
while(true)
{
if(bFlag)
break;
else
do stuff
}
线程B:
bFlag = true;
[更新]
为了让问题更清楚,线程A不会写入bFlag,它只是读取它以知道何时退出线程。 线程B会写bFlag来通知线程A停止。
解决方案中没有性能考虑因素。
这样做可能是精心设计的解决方案的一部分。 你需要注意不太明显的比赛条件和ABA问题(如果“做东西”使用bFlag)。
在下面,当我说“不好”时,我的意思是“两个线程可以同时读/写或写入/写入相同的数据吗?”。
在bFlag设置为真后,如果“做什么”开始执行仅仅几纳秒,会不会很糟糕?
什么样的情况会导致bFlag再次变成虚假?
如果在bFlag变得虚假之后“做东西”没有运行仅仅几秒钟,这会不会很糟糕?
在bFlag设置为false之前,程序多次运行“do stuff”会不好?
如果你能够正确回答这些问题,那么没有技术上的理由你不能这样做,但它可能是一条简单的路线。
在大多数情况下,std :: atomic是通过Atomic Compare And Swap(CAS)实现的(http://en.wikipedia.org/wiki/Compare-and-swap)CPU指令和MESI协议(http://en.wikipedia .org / wiki / MESI_protocol)将确保缓存一致性。 尽管如此,我不认为有任何阻止它与OS级别的互斥体一起实现。 如果这不是性能瓶颈,或者性能不是主要问题,那么在bFlag周围使用互斥锁和“做东西”可能会更容易。
另一种可能的途径是使用std :: futures从线程B异步“做东西”。使用这个,你可以把“do stuff”当作自己的函数,而不需要担心线程的细节。 (http://en.cppreference.com/w/cpp/thread/future)
**编辑**我不知道你的意思是一个特定于窗口的事件。 我的答案仍然存在于一般情况下,但由于我不知道窗口SetEvent的细节,它的语义可能会改变任何东西。
链接地址: http://www.djcxy.com/p/30803.html上一篇: Is it ok to use atomic<bool> for multiple thread synchronize than event