我可以安全地在多线程C++中使用int吗?

Fro*_*ier 4 c++ multithreading thread-safety

我有以下代码.有没有什么能使它成为非线程安全的?

class runner
{
public:
    volatile int exitFlag;

    // construct in thread A
    runner()
    {
        exitFlag = 0;
    }

    // run it in thread B
    void threadFunc()
    {
        // does not matter when the change is getting here
        while (exitFlag == 0)
        {
            // ... do stuff (not using exitFlag)
        }
    }

    // call it from thread A
    void signalThread()
    {
        exitFlag = 1; // only change one bit;
    }
};
Run Code Online (Sandbox Code Playgroud)

我创建了一个runner对象并threadFunc在另一个线程中启动它,一段时间后signalThread从第一个线程调用它.我被告知在不同的线程中访问相同的变量(至少它们是写入)可能导致读取垃圾值.但显然在上面的代码中(因为只改变了一位)并不重要.读/写的顺序也无关紧要.

Mik*_*our 7

不要volatile用于在线程之间共享变量.它没有给出原子性或同步的适当保证.缺乏原子性不太可能在这里引起特定的问题,虽然正式它会导致不确定的行为.缺乏同步意味着线程完全有可能永远不会看到变化,并永远继续运行.

在C++ 11或更高版本中,使用std::atomic<int>.该语言的早期版本没有标准的线程支持,因此您必须使用编译器提供的任何非标准工具.