我有以下代码:

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析构函数销毁线程之前将其加入。

09-26 15:19