想象一下,你有一个小的计算方法,这是一个线程的开始:
boost::mutex mMutex;
void MyClass::DoSomething {
boost::unique_lock<boost::mutex> tLock(mMutex);
if(tLock.owns_lock() {
// do some stuff...
}
}
你想在一个线程中启动它,从不同的成员函数引发。他们可以被称为同时,但你不知道什么时候:
void MyClass::Process {
boost::thread t1(&MyClass::DoSomething, this);
// go on ...
}
void MyClass::Foo {
boost::thread t2(&MyClass::DoSomething, this);
// and something more ...
}
如果t2
正在运行,如何防止执行t1
?我的unique_lock
似乎失败了。
答案 0 :(得分:2)
创建变量并在启动t1
线程之前,以原子方式增加该变量。完成后,以原子方式将该变量减少为null。在Foo
中,您应该检查此变量是否为空。
答案 1 :(得分:2)
根据Naszta的想法,这是一种使用原子布尔和原子交换的可能方法:
std::atomic<bool> thread_in_use(False);
void DoSomething()
{
if (thread_in_use.exchange(true))
return;
// ...
thread_in_use = false;
}