算法参考:http://www.parallellabs.com/2010/10/25/practical-concurrent-queue-algorithm/,非常适合生产者-消费者模型。
注意:1、析构函数没有加锁,因为需要同时对head lock和tail lock加锁。不建议在析构不确定的情况下使用。
2、经测试,比加锁的std::list快50%,比加锁的std::queue慢20%。
template <typename T>
class concurrent_queue
{
public:
concurrent_queue()
{
NODE* node = new NODE();
node->next = NULL;
head_ = node;
tail_ = node;
}
~concurrent_queue()
{
NODE* node = head_;
do
{
node = erase_(node);
}
while(node != NULL);
}
void push(const T& val)
{
NODE* node = new NODE();
node->val = val;
node->next = NULL;
scoped_lock lock(t_lock_);
tail_->next = node;
tail_ = node;
}
bool pop(T* val)
{
scoped_lock lock