假设我们有一个带停止标志的典型队列消费者循环:
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
这里的正确用法是什么?