Как правильно использовать прерывание concurrent_bounded_concurrent_queue TBB?

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

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.

Какое правильное использование здесь?


person Don Reba    schedule 08.11.2017    source источник
comment
Я полагаю, «петля», а не «остановка не удастся»?   -  person Anton    schedule 08.11.2017
comment
@anton, stop не завершит цикл, и цикл может зависнуть.   -  person Don Reba    schedule 08.11.2017
comment
Алексей, уточните, пожалуйста, я предполагаю, что "сбой" означает не достижение цели, а не какой-либо segfault или зависание стоп-функции.   -  person Anton    schedule 08.11.2017
comment
Возможный дубликат строительных блоков потока concurrent_bounded_queue — как Я «закрою» его?   -  person Don Reba    schedule 08.11.2017