我的问题涉及使用volatile for stop flag来停止某些线程服务器的方法。 在一些开源项目中,我看到声明停止是不稳定的:
class ThreadedServer {
public:
//...
// this method will be launched in separate worker thread
void run() {
while (!stop_) {
//some useful work...
}
if (stop_) {
//cleanup
}
}
void stop() {
stop_ = true;
}
private:
volatile bool stop_;
};
在我的服务器中,我声明了一个没有volatile修饰符的停止字段,一切正常。那么为什么在这种具体情况下使类变量变得不稳定呢?
答案 0 :(得分:0)
volatile
表示每次评估时都必须从主存储器中读取stop_
的值。
如果你不这样做会发生什么,在最坏的情况下,是运行而不停止,因为thread1将stop_
设置为false,但是thread2只查看CPU缓存上的缓冲stop
但请记住,一定不能会导致问题,但可能。