3

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

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

我已阅读如果两个线程同时访问同一个 bool 变量会发生什么?. 我有类似的情况,但情况不一样......

4

4 回答 4

4

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

C#:

volatile bool isQuitRequested;

爪哇:

volatile boolean isQuitRequested;

C++:volatile在 C++ 中几乎没有那么有用。一起去:

std::atomic<bool> isQuitRequested;
于 2012-02-15T10:38:38.710 回答
3

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

这是因为这种情况使内存重新排序不再是问题。

于 2012-02-15T08:15:40.613 回答
1

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

volatile boolean isQuitRequested;

或使用AtomicBoolean. 否则,一个线程所做的更改可能不会被其他线程看到。

但是,在您的情况下,有一个内置功能:只需调用interrupt()一个线程并处理它,请参阅:如何停止一个永远运行而没有任何使用的线程

也可以看看:

于 2012-02-15T08:16:38.363 回答
0

根据我在 Windows 上的经验,如果全局变量是 char、short、int、long 的基本类型之一,通常就足够了。如果您想以“正确的方式”进行操作,@Tudor 的解决方案看起来不错。

于 2012-02-15T12:13:05.663 回答