获取大小时是否必须锁定 std::queue?



我在多线程环境中使用std::queue。其他线程可以根据需要修改队列。在某个时候,我想打电话给std::queue::size().我是否必须锁定该呼叫的队列?如果我不这样做,会发生不好的事情吗?

这是未定义的行为,任何事情都可能发生。当一个线程访问对象而另一个线程正在或可能正在修改对象时,行为是未定义的。

我犹豫要不要添加这一点,因为您是否能想到一种失败的方法并不重要。它没有定义,句号。但以防万一有人认为它不可能失败:考虑一个队列,它动态分配一个控制结构,其中包含队列的大小和队列中每个对象的信息。放大队列时,可能会分配新的控制结构,释放旧结构,并更新指针。对size的并发调用可能会获取旧指针,然后在释放后访问它,并且可能包含完全不同的信息,甚至已从内存映射中删除。

仅仅阅读大小本身并不是问题。您将读取单个内存位置。您可能会读取错误的大小,因为另一个线程所做的大小更改可能尚未在此线程中可见,但您不会读取损坏的值。例如一个值的一半位和另一个值的一半位。

最新更新