Управление многопоточным потоком с помощью condition_variable
Я еще не сосредоточился на многопоточности C++11, но я пытаюсь заставить несколько потоков дождаться какого-то события в главном потоке, а затем все сразу продолжить (обрабатывая то, что произошло), и wait
снова, когда они закончили обработку... зацикливание, пока они не закрылись. Ниже не совсем так - это более простое воспроизведение моей проблемы:
std::mutex mutex;
std::condition_variable cv;
std::thread thread1([&](){ std::unique_lock<std::mutex> lock(mutex); cv.wait(lock); std::cout << "GO1!\n"; });
std::thread thread2([&](){ std::unique_lock<std::mutex> lock(mutex); cv.wait(lock); std::cout << "GO2!\n"; });
cv.notify_all(); // Something happened - the threads can now process it
thread1.join();
thread2.join();
Это работает... если я не остановлюсь на некоторых точках останова и не замедлюсь. Когда я это делаю, я вижу Go1!
а затем повесить, ожидая thread2
"s cv.wait
, Что не так?
Может быть, я не должен использовать переменную условия в любом случае... нет никаких условий вокруг wait
и нет данных, которые нужно защищать мьютексом. Что мне делать вместо этого?
1 ответ
Ты на правильном пути...
Просто добавьте логическое значение (защищенное мьютексом, обозначенным переменной условия), которое означает "go":
std::mutex mutex;
std::condition_variable cv;
bool go = false;
std::thread thread1([&](){ std::unique_lock<std::mutex> lock(mutex); while (!go) cv.wait(lock); std::cout << "GO1!\n"; });
std::thread thread2([&](){ std::unique_lock<std::mutex> lock(mutex); while (!go) cv.wait(lock); std::cout << "GO2!\n"; });
{
std::unique_lock<std::mutex> lock(mutex);
go = true;
cv.notify_all(); // Something happened - the threads can now process it
}
thread1.join();
thread2.join();