我有两个线程:'main'和'worker',以及一个全局变量bool isQuitRequested
,main
线程将使用它来通知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?。 我有类似的东西,但情况不一样......
答案 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的解决方案看起来很好。