【问题标题】:is boost::lockfree::queue not lockfree with c++11?boost::lockfree::queue 在 c++11 中不是无锁的吗?
【发布时间】:2013-02-25 21:40:46
【问题描述】:

我正在尝试在这个 websocket++ 示例 https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp 中将 boost::lockfree::queue 替换为 std::queue

看起来它可以在不真正更改任何语法但删除boost::unique_lock 行的情况下完成。

但是,当我查看 boost 示例时,它有一个代码部分检查无锁 http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

当我查看 lockfree::queue 上的文档时,它在 is_lock_free() http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.html 上说:

bool is_lock_free(void) const;

警告

它只检查队列头和尾节点是否以及 freelist 可以无锁方式修改。在大多数平台上, 如果这是真的,整个实现是无锁的。使用 c++0x 风格 原子,不可能提供完全准确的 实施,因为需要测试每个内部节点, 如果将分配更多节点,这是不可能的 操作系统。

返回:如果实现是无锁的,则为真。

我不知道“c++0x 风格的原子”是什么,但我很确定 c++0x 意味着 c++11。

我用的是c++11,只是用boost::lockfree::queue代替std::queue,这样不会实现无锁吗?

【问题讨论】:

  • 我敦促您在使用无锁算法之前进行测量——它们很简洁,但设计为 可扩展安全(即。防止优先级倒置)——性能不太受关注,通常更糟。例如,Boost 的无锁队列实现将比锁定的std::queue 慢,除非您有多个内核和非常高的争用量。
  • I have no idea what "c++0x-style atomics" are 正在谈论图书馆所依赖的boost::atomic
  • +1 用于 lib 示例

标签: c++ boost c++11 queue lock-free


【解决方案1】:

我不知道“c++0x 风格的原子”是什么,但我很确定 c++0x 意味着 c++11。

  • c++0x 指的是 c++03 和/或 c++07 C++ 标准。
  • c++1x通常指c++11
  • c++1y 指的是 c++11 的后继。

【讨论】:

  • 这完全不正确。 C++0x 和 C++1x 都指的是 c++11。 c++1y 指的是 c++14 或 c++17,但通常是前者。
【解决方案2】:

没有。 “不可能提供完全准确的实现”评论指的是is_lock_free() - 即不保证is_lock_free() 返回的结果准确反映了实现是否是无锁的。但是,如果 is_lock_free() 返回 true,则该实现很可能是无锁的 - 但不是绝对的,保证铸铁。

【讨论】:

  • 谢谢!你会说使用上面的例子是安全的,还是我应该定期丢失消息/连接?
  • 我想您可能想了解lock-free algorithm 是什么。
  • 如果is_lock_free 是假的,那只意味着它会在内部使用锁。该算法仍然是线程安全的,只是没有人们使用无锁算法的额外属性。
  • 老实说,这是一个非常不同的问题(基本上,“什么是无锁算法”),而不是你原来的问题,即特定库中的特定算法是否是无锁的.
  • 老实说,我不认为这对网站的其他读者有用 - 人们不会在 boost::lockfree::queue 上查看特定问题以获取有关什么是无锁算法的一般信息是。如果您认为此类信息对网站的其他读者有用,我可以建议您问一个不同的问题吗? (尽管仔细考虑它应该在哪个 SE 网站上以及之前是否被问过)。
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2013-07-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多