c++实现多线程消息通信队列

#ifndef _SYNC_SIMPLEQUEUE_QUEUE_HPP_
#define _SYNC_SIMPLEQUEUE_QUEUE_HPP_

#include <queue>

using namespace std;

namespace utility {

#ifndef _SYNC_SIMPLEQUEUE_QUEUE_HPP_
#define _SYNC_SIMPLEQUEUE_QUEUE_HPP_

#include <queue>

using namespace std;

namespace utility {

template <typename T>
class SyncSimpleQueue {
public:
void put(const T& msg) {
std::unique_lock<std::mutex> guard(m_mutex);
m_queue.push(msg);
if (m_queue.size() == 1) {
can_read.notify_one();
}
}

T take() {
std::unique_lock<std::mutex> guard(m_mutex);
if (m_queue.empty()) {
//guard在队列位空时释放锁,保证其他线程可以操作共享的数据,当队列不为空时并且其他线程调用notify_one时,重新获得锁,继续操作数据
can_read.wait(guard, [this]() { return !m_queue.empty(); });
}
T msg = m_queue.front();
m_queue.pop();
return msg;
}

bool take_no_wait(T& msg) {
std::unique_lock<std::mutex> guard(m_mutex);
if (m_queue.empty()) {
return false;
}
msg = m_queue.front();
m_queue.pop();
return true;
}

private:
std::queue<T> m_queue;
std::mutex m_mutex;
std::condition_variable can_read;
};

} // namespace utility

#endif
posted @ 2023-07-03 10:45  花花公子1234  阅读(316)  评论(0)    收藏  举报