线程共享的全局变量的原子性

时间:2018-07-02 02:54:06

标签: c multithreading atomic c11

好的,这是一个琐碎的问题。问题是,我在这里找到的每个答案都有3/4个冲突的答案。

我有一个非常简单的问题。我有一个名为ABORT_SIGNAL的全局变量。到目前为止,它已声明为volatile int ABORT_SIGNAL。我了解这并不能满足我的期望...就是...

我有两个线程可能会写入ABORT_SIGNAL。它将从0开始,几秒钟后变为1。其他线程将定期读取此变量,并检查该值是否已设置为1。

以下将实现这一目标....

#include <stdint.h>
atomic_int ABORT_SIGNAL;
...

// When updating the value ...
atomic_store(&ABORT_SIGNAL, someValue);

// When reading the value ...
if (atomic_load_explicit(&ABORT_SIGNAL, memory_order_relaxed))
    doSomething()

其他人也建议我需要执行以下操作。 在每个写入问题atomic_thread_fence(memory_order_acq_rel);之后和每个读取问题atomic_thread_fence(memory_order_acq_rel);

之后

1 个答案:

答案 0 :(得分:2)

如果想要获得语义,使用宽松的一致性没有多大意义。

但是,坦率地说,所有这些看起来都太复杂了,没有太多收获。

只需使用

_Bool _Atomic flag;

,然后是通常的操作,则不需要使用所有这些atomic_...伪函数。您将获得顺序一致性。

然后,您可以调查这是否确实是瓶颈,并在特定位置替换为另一个一致性。