Предположим, у нас есть типичный цикл потребления очереди с флагом остановки:
class consumer {
atomic<bool> keep_running;
concurrent_bounded_queue queue;
void loop() {
while (keep_running)
// <- danger zone
queue.pop();
}
void stop() {
keep_running = false;
queue.abort();
}
};
Если использовать как написано, stop
потерпит неудачу при вызове после проверки keep_running
, но перед вызовом pop
, поскольку abort
только завершает pop
вызовы, которые уже выполняются.
Мы также не можем использовать мьютекс, чтобы убедиться, что проверка и pop
выполняются атомарно, поскольку тогда мы не сможем вызвать abort
, пока выполняется pop
.
Какое правильное использование здесь?
stop
не завершит цикл, и цикл может зависнуть. - person Don Reba   schedule 08.11.2017