【发布时间】:2013-12-20 18:57:14
【问题描述】:
我使用 C++11 中的新 std::atomic 生成了无锁(无锁)队列的简单实现。我在这里看不到我做错了什么。
#include <atomic>
template<typename T>
class lockless_queue
{
public:
template<typename DataType>
struct node
{
node(const DataType& data)
: data(data), next(nullptr) {}
DataType data;
node* next;
};
lockless_queue()
: head_(nullptr) {}
void produce(const T &data)
{
node<T>* new_node = new node<T>(data);
// put the current value of head into new_node->next
new_node->next = head_.load(std::memory_order_relaxed);
// now make new_node the new head, but if the head
// is no longer what's stored in new_node->next
// (some other thread must have inserted a node just now)
// then put that new head into new_node->next and try again
while(!std::atomic_compare_exchange_weak_explicit(
&head_,
&new_node->next,
new_node,
std::memory_order_release,
std::memory_order_relaxed)) {}
}
node<T>* consume_all()
{
// Reset queue and return head atomically
return head_.exchange(nullptr, std::memory_order_consume);
}
private:
std::atomic<node<T>*> head_;
};
// main.cpp
#include <iostream>
int main()
{
lockless_queue<int> s;
s.produce(1);
s.produce(2);
s.produce(3);
auto head = s.consume_all();
while (head)
{
auto tmp = head->next;
std::cout << tmp->data << std::endl;
delete head;
head = tmp;
}
}
我的输出:
2
1
Segmentation fault (core dumped)
我能否提供一些在哪里查看的指示或指示我可能做错了什么?
谢谢!
【问题讨论】:
-
以防万一你不知道(不建议你放弃你的努力),但 boost 有一个无锁队列。 boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html
-
您正在推动三个项目,然后在一个线程中依次弹出它们。为什么不能调试这个?如果你不能用一个线程解决它并且没有争用,我对多个生产者和一个消费者不抱太大希望。
标签: c++ multithreading c++11 atomic lock-free