使用细粒度锁的c++线程安全队列

来源:互联网 发布:iphone8爆炸知乎 编辑:程序博客网 时间:2024/06/05 07:31
</pre><p>使用细粒度锁的c++线程安全队列实现:</p><p></p><pre name="code" class="cpp">#include<iostream>#include<thread>#include<mutex>#include<memory>template<typename T>class threadsafe_queue{private:struct node{std::shared_ptr<T> data;std::unique_ptr<node> next;};std::unique_ptr<node> head;node* tail;std::mutex head_mutex;std::mutex tail_mutex;node* get_tail(){std::lock_guard<std::mutex> tail_lock(tail_mutex);return tail;}std::unique_ptr<node> pop_head(){std:; lock_guard<std::mutex>head_lock(head_mutex)if (head.get() == get_tail())return nullptr;std::unique_ptr<node>const old_head = std::move(head);head = std::move(old_head->next);return old_head;}public:threadsafe_queue(){}threadsafe_queue(const threadsafe_queue& other) = delete;threadsafe_queue& operator=(const threadsafe_queue &other) = delete;void push(T new_value){std::shared_ptr<T> new_data(std::make_shared<T>(std::move(new_value)));std::unique_ptr<node>p(new node);node* const new_tail = p.get();std::lock_guard < std::mutex。 tail_lock(tail_mutex);tail->data = new_data;tail->next = std::move(p);tail = new_tail;}};

0 0