我有一个共享队列(使用单例队列包装器实现)和一个读者线程和一个写入器线程。我还有一种机制,可以在编写器线程向队列添加元素(入队)时通知读者线程。读取器线程在被通知时仅出列一个元素。在这种情况下是否需要读写锁。
由于编写器只是排队和读取器出列,所以如果读取器在出队时检查队列大小,我觉得不需要锁定。
答案 0 :(得分:1)
我认为你的意思是stl :: queue和没有 stl容器上的大多数操作都不是线程保存。有关例外的讨论,请参阅C++11 STL containers and thread safety。假设开发人员将实施自己的检查,STL更喜欢高速安全性(例如数组索引的范围检查等)。
答案 1 :(得分:1)
由于编写器只是排队和读取器出列,我觉得不需要锁定,如果读取器在出队时检查队列大小。
当其他线程修改队列时,单独操作已经不安全的其他问题。在c ++中,对非原子共享变量(其中至少有一个是写入)的任何非同步访问都是数据竞争,因此是UB。