我有以下代码:
MyClass::aMethod()
{
...
bool isStarted = false;
boost::thread(boost::bind(&MyClass::CheckTimeoutThread, this, isStarted));
...//some time later
isStarted = true;
...
}
MyClass::checkTimeoutThread(bool &isStarted)
{
...//some code here
while(anotherFlag)
{
...//do something
if(isStarted)//ALWAYS THE INITIAL VALUE OF FALSE
{
}
...
}
}
我曾期望 isStarted 变量可以用作标志,但是我错了或者做错了什么。
最佳答案
boost::thread
将存储其参数的副本。但是您可以通过在reference_wrapper
的帮助下传递boost::ref
来模拟引用。另请注意,您无需调用boost::bind
:
boost::thread t(&MyClass::CheckTimeoutThread, this, boost::ref(isStarted));
但是请注意,您现在在
isStarted
上拥有种族条件。您需要使用互斥锁来同步访问它,或者使用原子类型(如果平台上可用)(如果您具有C++ 11,则可以使用@PeteBecker建议的std::atomic<bool>
)。编辑显然,以上所有假设
isStated
的生存时间至少与使用它的thread
一样长。实际上,这意味着必须在aMethod
返回时完成线程。或者,您可以使isStarted
成为数据成员。但是您仍然必须确保在MyClass
析构函数销毁线程之前将其加入。