Предотвращение запуска потока дважды - PullRequest
1 голос
/ 21 сентября 2011

Представьте, что у вас есть небольшой метод расчета, который начинается потоком:

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 ]

2 голосов
/ 21 сентября 2011

Исходя из идеи Naszta, вот возможный подход с использованием атомных булов и атомных перестановок:

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

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

  // ...

  thread_in_use = false;
}
2 голосов
/ 21 сентября 2011

Создайте переменную и, прежде чем запускать поток t1, увеличьте эту переменную атомарным способом.Когда он закончится, уменьшите эту переменную до нуля атомарным способом.В Foo вы должны просто проверить, является ли эта переменная нулевой или нет.

Проверьте этот пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...