См. следующий код:
std::mutex mutex;
std::condition_variable cv;
std::atomic<bool> terminate;
// Worker thread routine
void work() {
while( !terminate ) {
{
std::unique_lock<std::mutex> lg{ mutex };
cv.wait(lg);
// Do something
}
// Do something
}
}
// This function is called from the main thread
void terminate_worker() {
terminate = true;
cv.notify_all();
worker_thread.join();
}
Возможен ли следующий сценарий?
- Рабочий поток ожидает сигналов.
- The main thread called
terminate_worker()
;- The main thread set the atomic variable
terminate
totrue
, and then signaled to the worker thread. - Теперь рабочий поток просыпается, выполняет свою работу и загружается из
terminate
. На этом этапе изменениеterminate
сделанное основным потоком еще не замечено, поэтому рабочий поток решает дождаться другого сигнала.
- The main thread set the atomic variable
- Теперь возникает тупик...
Интересно, это когда-либо возможно. Как я понял, std::atomic
гарантирует только отсутствие состояния гонки, но порядок памяти - это другое. Вопросы:
- Это возможно?
- Если это невозможно, возможно ли это, если
terminate
не атомарная переменная, а простоbool
? Или атомарность тут ни при чем? - Если это возможно, что мне делать?
Спасибо.
std::memory_order
- person melak47   schedule 27.12.2016std::memory_order
. Но я понятия не имею, какstd::condition_variable
действует с ограничениями порядка памяти. - person Junekey Jeon   schedule 27.12.2016memor_order_seq_cst
) иcondition_variable::notify_all
. - person Zeta   schedule 27.12.2016terminate
не является атомарным. Делать его атомарным избыточно и расточительно. - person Pete Becker   schedule 27.12.2016