玖叶教程网

前端编程开发入门

C++11 线程安全的BlockingQueue实现

#ifndef _BLOCKINGQUEUE_H_

#define _BLOCKINGQUEUE_H_

#include <mutex>

#include <condition_variable>

#include <deque>

#include <assert.h>

template <typename T>

class BlockingQueue {

public:

using MutexLockGuard = std::lock_guard<std::mutex>;

BlockingQueue()

: _mutex(),

_notEmpty(),

_queue()

{

}

BlockingQueue(const BlockingQueue &) = delete;

BlockingQueue& operator=(const BlockingQueue &) = delete;

void put(const T &x)

{

{

MutexLockGuard lock(_mutex);

_queue.push_back(x);

}

_notEmpty.notify_one();

}

void put(T &&x)

{

{

MutexLockGuard lock(_mutex);

_queue.push_back(std::move(x));

}

_notEmpty.notify_one();

}

T take()

{

std::unique_lock<std::mutex> lock(_mutex);

_notEmpty.wait(lock, [this]{ return !this->_queue.empty(); });

assert(!_queue.empty());

T front(std::move(_queue.front()));

_queue.pop_front();

return front;

}

size_t size() const

{

MutexLockGuard lock(_mutex);

return _queue.size();

}

private:

mutable std::mutex _mutex;

std::condition_variable _notEmpty;

std::deque<T> _queue;

};

#endif // _BLOCKINGQUEUE_H_


//参考了muduo的BlockingQueue的实现,用C++11改写

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言