【问题标题】:Does a single queue with separate reader and writer threads needs locking?具有单独读取器和写入器线程的单个队列是否需要锁定?
【发布时间】:2015-07-18 07:52:36
【问题描述】:

我有一个共享队列(使用单例队列包装器实现)以及一个读取器线程和一个写入器线程。当写入线程将元素(入队)添加到队列时,我还有一种机制可以通知读取线程。阅读器线程在收到通知时仅将一个元素出列。在这种情况下是否需要读写锁。

由于 writer 只是 enqueing 和 reader dequeing 我觉得不需要锁,如果 reader 在 dequeing 时检查队列大小。

【问题讨论】:

  • 今天单身人士到底怎么了?
  • 需要更多细节,到目前为止我能提供的最好的就是“也许”
  • 您几乎可以肯定确实需要一把锁。但正如 Jasen 所提到的,更多细节(即代码)会很好,以便可以给出更具体的 cmets。
  • 编写器线程会在每次插入时通知阅读器,阅读器在收到通知时仅读取一个元素。对吗?
  • 是的。我会更新问题

标签: c++ multithreading queue readerwriterlock


【解决方案1】:

由于 writer 只是 enqueing 和 reader dequeing 我觉得不需要锁,如果 reader 在 dequeing 时检查队列大小

当队列被另一个线程修改时,单独操作已经不安全的其他问题之一。在 c++ 中,对非原子共享变量的任何非同步访问(其中至少一个是写入)都是数据竞争,因此是 UB。

【讨论】:

  • 为什么投反对票?我的回答有什么问题吗?还是不够详细?
【解决方案2】:

我假设您的意思是 stl::queue 并且 no stl 容器上的大多数操作都不是线程保存。有关异常的讨论,请参阅C++11 STL containers and thread safety。 STL 更喜欢速度而不是安全性(例如,数组索引的范围检查等),假设开发人员将实施他们自己的检查。

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2012-05-08
    相关资源
    最近更新 更多