两个线程使用相同的变量

时间:2012-02-15 08:10:43

标签: c++ multithreading synchronization shared-state

我有两个线程:'main'和'worker',以及一个全局变量bool isQuitRequestedmain线程将使用它来通知worker,何时退出它的while循环(类似这样:while(isQuitRequested == false) { ... do some stuff ... }

现在,我有点担心...... 我是否需要对isQuitRequested使用某种互斥保护,考虑到只有一个线程(main)执行isQuitRequested = true操作,而另一个(worker)只执行检查没有别的吗?

我看过What could happen if two threads access the same bool variable at the same time?。 我有类似的东西,但情况不一样......

4 个答案:

答案 0 :(得分:4)

您尚未指定使用的语言,并且您发布的小代码段可能是C#,Java或C ++。以下是针对每种模式的“模式”的一些常见解决方案:

C#:

volatile bool isQuitRequested;

爪哇:

volatile boolean isQuitRequested;

C ++:C ++中的volatile几乎没用。跟着:

std::atomic<bool> isQuitRequested;

答案 1 :(得分:3)

对于volatile bool,这应该是安全的,只要您不使用受生产者线程影响的消费者(检查bool)线程中的任何数据(将bool设置为true),AND在您的消费者线程发现bool已设置为true之后,它不会尝试重用/重置它作为与生产者线程通信的方式(如您链接的示例中所示)。

这是因为该案例使内存重新排序成为非问题。

答案 2 :(得分:1)

在Java 中,您只需将该变量标记为volatile

volatile boolean isQuitRequested;

或使用AtomicBoolean。否则,其他线程可能无法看到一个线程所做的更改。

但是在您的情况下,有一个内置功能:只需在线程上调用interrupt()并处理它,请参阅:How to stop a thread that is running forever without any use

另见:

答案 3 :(得分:0)

根据我在windows上的经验,如果它是char,short,int,long之类的基本类型之一,通常就足够了。 如果你想以“正确的方式”做到这一点,@ Tudor的解决方案看起来很好。