来自Boost的无等待队列。原子示例崩溃 我在寻找用原子实现等待队列的C++实现,发现Boost。Atomic例子: template<typename T> class waitfree_queue { public: struct node { T data; node * next; }; void push(const T &data) { node * n = new node; n->data = data; node * stale_head = head_.load(boost::memory_order_relaxed); do { n->next = stale_head; } while (!head_.compare_exchange_weak(stale_head, n, boost::memory_order_release)); } node * pop_all(void) { T * last = pop_all_reverse(), * first = 0; while(last) { T * tmp = last; last = last->next; tmp->next = first; first = tmp; } return first; } waitfree_queue() : head_(0) {} // alternative interface if ordering is of no importance node * pop_all_reverse(void) { return head_.exchange(0, boost::memory_order_consume); } private: boost::atomic<node *> head_; }; int main() { // pop elements waitfree_queue<int>::node * x = q.pop_all() while(x) { X * tmp = x; x = x->next; // process tmp->data, probably delete it afterwards delete tmp; } }

来自Boost的无等待队列。原子示例崩溃 我在寻找用原子实现等待队列的C++实现,发现Boost。Atomic例子: template<typename T> class waitfree_queue { public: struct node { T data; node * next; }; void push(const T &data) { node * n = new node; n->data = data; node * stale_head = head_.load(boost::memory_order_relaxed); do { n->next = stale_head; } while (!head_.compare_exchange_weak(stale_head, n, boost::memory_order_release)); } node * pop_all(void) { T * last = pop_all_reverse(), * first = 0; while(last) { T * tmp = last; last = last->next; tmp->next = first; first = tmp; } return first; } waitfree_queue() : head_(0) {} // alternative interface if ordering is of no importance node * pop_all_reverse(void) { return head_.exchange(0, boost::memory_order_consume); } private: boost::atomic<node *> head_; }; int main() { // pop elements waitfree_queue<int>::node * x = q.pop_all() while(x) { X * tmp = x; x = x->next; // process tmp->data, probably delete it afterwards delete tmp; } },c++,boost,concurrency,c++11,atomic,C++,Boost,Concurrency,C++11,Atomic,当我编译原始boost时,它运行时会发生崩溃 它是Boost.Atomic中的bug还是Atomic的MSVC实现中的bug?它看起来像MSVC实现中的bug。断言失败,因为Order2是memory\u order\u release。但是,正如所指出的(与C++标准一样)(强调矿山): 3参数过载相当于4参数过载 成功_order==order,失败_order==order,除非 顺序是std::memory\u order\u acq\u rel,则故障顺序是 std::memory\u

当我编译原始boost时,它运行时会发生崩溃


它是Boost.Atomic中的bug还是Atomic的MSVC实现中的bug?

它看起来像MSVC实现中的bug。断言失败,因为
Order2
memory\u order\u release
。但是,正如所指出的(与C++标准一样)(强调矿山):

3参数过载相当于4参数过载 成功_order==order,失败_order==order,除非 顺序是std::memory\u order\u acq\u rel,则故障顺序是 std::memory\u order\u acquire,如果顺序为std::memory\u order\u release,则为 然后故障顺序是std::内存顺序\u松弛

换句话说,
Order2
必须是
std::memory\u order\u released
,因为您传递了
memory\u order\u release
作为
order
。MSVC的实现不是这样的,它是一个bug。如果可能,请将其报告为错误

Assertion failed: _Order2 != memory_order_release, file c:\program files (x86)\m
icrosoft visual studio 11.0\vc\include\xxatomic, line 742