【发布时间】: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