【问题标题】:Thread-Safe C/C++ queue optimized for push针对推送优化的线程安全 C/C++ 队列
【发布时间】:2012-11-13 17:00:48
【问题描述】:

我正在寻找针对推送操作进行优化的线程安全 C/C++ 队列实现。我不介意 pop 操作是否阻塞,但我不想在 push 端阻塞。

让我解释一下原因。我计划为 C# 应用程序编写探查器,我将有多个线程将消息推送到单个调度程序线程。我不介意调度程序是否会很快阻塞,但我想避免推送方面的任何延迟。

【问题讨论】:

  • Fober, Orlarey and Letz 有一个通用的多读取器、多写入器非阻塞队列,尽管它具有无锁编程的常见问题,即它无法释放弹出元素的内存。我可以想象,如果你愿意在出队端添加一个锁,你也许可以克服这个问题。如果你只需要一个消费者,那就容易多了。

标签: c++ c thread-safety queue


【解决方案1】:

您可以使用boost.lockfree。它在 boost 沙箱 svn 中,计划在 1.53 或 1.54 版本中与 boost 一起发布,具体取决于 boost.atomic 是否及时发布。 目前 boost.lockfree 依赖于 std::atomic 而不是 boost.atomic,所以你需要一个 c+11 编译器来使用它。

【讨论】:

  • 我将在今天晚些时候对此进行调查。不过我可能会受到限制,我的团队使用不支持原子的 VS2010,我们正在努力获取 VS2012 的副本,但这可能暂时不会发生。所以我最终可能会使用旧版本。
  • 感谢您的评论,我阅读了更多内容,该库看起来很有希望。我找到了这个链接:boost-sandbox.sourceforge.net/doc/html/lockfree.html 它有一些非常好的信息。我实际上认为我将使用boost-sandbox.sourceforge.net/doc/html/boost/lockfree/…。我会给每个线程一个专用队列,并让一个线程从队列中拉出,然后将内容刷新到管道或将其放入 SQL 数据库中。
  • 对于以后阅读此内容的任何人,请仔细阅读此评论,lockfree 不存在于 1.52(截至今天的当前版本)中。确保你有 >=1.53 或者你可能会像我一样浪费几个小时,我的错是阅读不够仔细:)
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 2014-03-13
  • 2023-03-04
  • 1970-01-01
  • 2014-04-07
  • 2021-11-18
  • 2015-02-16
  • 2010-11-15
相关资源
最近更新 更多