原载于何处以及原博主都不记得了,经过一点修改,增加空判断以及清空两个用法,增加两个构造函数,满足默认构造以及拷贝,能够将其放入容器中:
/// <summary>
/// 消息队列
/// </summary>
/// <typeparam name="T">消息类型</typeparam>
template<class T> class MessageQueue {
public:
MessageQueue() {}
MessageQueue(const MessageQueue& other) {
std::unique_lock<std::mutex> lck(const_cast<std::mutex&>(other._mtx));
_queue = other._queue;
}
/// <summary>
/// 推入消息
/// </summary>
/// <param name="msg">消息对象</param>
void push(const T& msg) {
std::unique_lock<std::mutex>lck(_mtx);
_queue.push(msg);
_cv.notify_all();
}
/// <summary>
/// 轮询消息
/// </summary>
/// <param name="msg">消息对象</param>
/// <returns>是否接收到消息</returns>
bool poll(T& msg) {
std::unique_lock<std::mutex>lck(_mtx);
if (_queue.size())
{
msg = _queue.front();
_queue.pop();
return true;
}
return false;
}
/// <summary>
/// 等待消息
/// </summary>
/// <param name="msg">消息对象</param>
void wait(T& msg) {
std::unique_lock<std::mutex>lck(_mtx);
while (!_queue.size()) _cv.wait(lck);
msg = _queue.front();
_queue.pop();
}
//队列长度
size_t size() {
std::unique_lock<std::mutex>lck(_mtx);
return _queue.size();
}
bool empty() {
std::unique_lock<std::mutex>lck(_mtx);
return (_queue.size() == 0);
}
void clear() {
std::queue<T> emptyQueue;
{
std::unique_lock<std::mutex> lck(_mtx);
_queue = std::move(emptyQueue);
}
}
private:
//队列
std::queue<T> _queue;
//互斥变量
std::mutex _mtx;
//条件变量
std::condition_variable _cv;
};
使用方式:
可以自定义消息类或者默认数据类型
MessageQueue<int> msg_que;
or
class MyMessage {
public:
int ex = 0;
int id;
int poccess;
};
MessageQueue<MyMessage > msg_que;
可以将消息队列放入vector容器中方便循环访问(不创建在堆区也可以)
std::vector<MessageQueue<int>> *msgList = new std::vector<MessageQueue<int>>();
for (int i = 0; i < 2; i++) {
MessageQueue<int> msg;
msgList->push_back(msg);
}
for(int i=0;i<2;i++){
(*msgList)[i].push(1);
}