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从第一个线程调用它.我被告知在不同的线程中访问相同的变量(至少它们是写入)可能导致读取垃圾值.但显然在上面的代码中(因为只改变了一位)并不重要.读/写的顺序也无关紧要.
不要volatile用于在线程之间共享变量.它没有给出原子性或同步的适当保证.缺乏原子性不太可能在这里引起特定的问题,虽然正式它会导致不确定的行为.缺乏同步意味着线程完全有可能永远不会看到变化,并永远继续运行.
在C++ 11或更高版本中,使用std::atomic<int>.该语言的早期版本没有标准的线程支持,因此您必须使用编译器提供的任何非标准工具.
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |