C ++类在后台执行操作 - 是否有必要将stop标志声明为volatile?

时间:2014-04-23 07:20:02

标签: multithreading c++11 concurrency volatile

我的问题涉及使用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修饰符的停止字段,一切正常。那么为什么在这种具体情况下使类变量变得不稳定呢?

1 个答案:

答案 0 :(得分:0)

volatile表示每次评估时都必须从主存储器中读取stop_的值。 如果你不这样做会发生什么,在最坏的情况下,是运行而不停止,因为thread1将stop_设置为false,但是thread2只查看CPU缓存上的缓冲stop

但请记住,一定不能会导致问题,但可能