Управление многопоточным потоком с помощью 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();
Другие вопросы по тегам