1
我有一个类,其中一个布尔同时访问。但是在我的情况下,它只在构造函数中初始化为false,然后设置为false。我是否正确地相信即使可能发生竞争,结果将是有效的和定义的?由于整个布尔没有必要写入“!isStopping_”以评估为true。将布尔值设置为true时需要原子CAS
class MyClass
{
public:
MyClass() : isStopping_(false), thread_([=]{Run();}) {}
void Stop()
{
isStopping_ = true;
}
private:
void Run()
{
while(!isStopping_) // data race
{
// Work
}
}
bool isStopping_ ;
boost::thread thread_;
};
只要缓存不阻止未读新值,那么它应该是罚款。只需要设置一个位(即使写入本身并非在所有单词中都是原子的) - 并且它只能在“共享”状态下设置为一种方式。 **更好地将其标记为volatile(用于缓存/访问问题)。** – 2010-08-06 17:56:07
是的,关于volatile与MT的问题几乎每天都会在这里问到。最近一个:http://stackoverflow.com/questions/3372703/volatile-and-multithreading – Dummy00001 2010-08-06 23:31:34