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

fre*_*ish 0 c++ queue locking

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

Dav*_*rtz 8

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

我不愿意添加这个,因为你是否可以想到它可能失败的方式是不相关的.它没有定义,期间.但是,万一有人认为没有可想象的方法可能会失败:考虑一个动态分配控制结构的队列,该控制结构包含队列的大小和队列中每个对象的信息.当队列被放大时,可以分配新的控制结构,释放旧的结构,并更新指针.并发调用size可能会获取旧指针,然后在释放后访问它,并且可能包含完全不同的信息,甚至已从内存映射中删除.

  • 但是,请学习最重要的一课 - 无论你是否能想到失败的方式都无关紧要.事情总是以人们当时没有想到的方式失败.遵守规则并编写符合相关标准/规范的代码. (4认同)