防止两次启动线程

时间:2011-09-21 12:49:06

标签: c++ multithreading boost-thread

想象一下,你有一个小的计算方法,这是一个线程的开始:

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似乎失败了。

2 个答案:

答案 0 :(得分:2)

创建变量并在启动t1线程之前,以原子方式增加该变量。完成后,以原子方式将该变量减少为null。在Foo中,您应该检查此变量是否为空。

Check this example.

答案 1 :(得分:2)

根据Naszta的想法,这是一种使用原子布尔和原子交换的可能方法:

std::atomic<bool> thread_in_use(False);

void DoSomething()
{
  if (thread_in_use.exchange(true))
    return;

  // ...

  thread_in_use = false;
}