我在多线程环境中使用std::queue
。其他线程可以根据需要修改队列。在某些时候,我想打电话给std::queue::size()
。我是否必须锁定该呼叫的队列?如果我不这样做会发生什么坏事吗?
答案 0 :(得分:8)
这是未定义的行为,任何事情都可能发生。当一个线程访问一个对象而另一个线程正在或可能正在修改它时,行为是未定义的。
我不愿意添加这个,因为你是否可以想到它可能失败的方式并不重要。它没有定义,期间。但是,万一有人认为没有可想象的方法可能会失败:考虑一个动态分配控制结构的队列,该控制结构包含队列的大小和队列中每个对象的信息。当队列被放大时,可以分配新的控制结构,释放旧的结构,并更新指针。对size
的并发调用可能会获取旧指针,然后在它被释放后访问它,并且可能包含完全不同的信息,甚至已从内存映射中删除。
答案 1 :(得分:-9)
只是阅读尺寸本身并不是一个问题。您将要读取单个内存位置。您可能会读取错误的大小,因为此线程中可能尚未显示另一个线程所做的大小更改,但您不会读取损坏的值。例如一个值的一半位和另一个值的另一个位。