Cplusplus消息队列使用代码
时间: 2023-09-28 17:10:16 浏览: 152
C++ 消息队列的使用帮助
3星 · 编辑精心推荐
以下是一个简单的使用C++消息队列的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
std::queue<int> msg_q; // 消息队列
void consumer() {
while (true) {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return !msg_q.empty(); }); // 等待消息队列非空
int msg = msg_q.front();
msg_q.pop();
lck.unlock();
cv.notify_all();
std::cout << "Consumed Message: " << msg << std::endl;
if (msg == 0) {
break;
}
}
}
void producer() {
for (int i = 1; i <= 10; ++i) {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return msg_q.size() < 5; }); // 等待消息队列长度小于5
msg_q.push(i);
lck.unlock();
cv.notify_all();
std::cout << "Produced Message: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟生产消息的时间
}
std::unique_lock<std::mutex> lck(mtx);
msg_q.push(0); // 发送停止消息
lck.unlock();
cv.notify_all();
}
int main() {
std::thread consumer_thread(consumer);
std::thread producer_thread(producer);
consumer_thread.join();
producer_thread.join();
return 0;
}
```
在这个示例中,`msg_q`是一个整数队列,用于存储生产者生成的消息。生产者线程不断向队列中添加消息,当队列长度达到5时,会等待消费者线程从队列中取出消息。消费者线程不断从队列中取出消息,当队列为空时,会等待生产者线程添加消息。当生产者线程添加一个值为0的消息时,消费者线程会停止循环。
在这个示例中,互斥锁和条件变量用于保证生产者和消费者线程之间的同步。生产者线程在修改队列时会加锁,消费者线程在取出队列中的消息时也会加锁。条件变量用于通知生产者和消费者线程有新的消息或队列已满/为空。
阅读全文