可以使用原子<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

下一篇: Calling SetEvent with an invalid handle