2013-02-10 79 views
2

我一直在寻找的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; 
} 

} 

Example at boost official site

我已经更换了提升性病与MSVC 2012年 编译它崩溃与下一条消息在控制台:

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

当我编译原升压运行W/A崩溃。

它是在Boost.Atomic或MSVC实现原子的bug吗?

回答

1

它看起来像MSVC实施中的错误。断言失败,因为Order2memory_order_release。然而,如所指出here(其是相同的C++标准)(重点煤矿):

的3参数超负荷等同于4-参数超载 与success_order ==顺序,和failure_order ==除了如果 命令是std :: memory_order_acq_rel,那么failure_order是 std :: memory_order_acquire和如果命令是std :: memory_order_release 那么failure_order是std :: memory_order_relaxed

换句话说,Order2必须std::memory_order_relaxed针对你的情况4-参数超载,因为你通过memory_order_releaseorder。在MSVC的实现中这不是一个错误。如果可能,请将其报告为错误。