#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
// 消息队列类
class MessageQueue {
public:
// 向队列中添加消息
void enqueue(int message) {
std::lock_guard<std::mutex> lock(mtx); // 加锁,确保线程安全
queue.push(message);
cond.notify_one(); // 通知等待的线程
}
// 从队列中取出消息
int dequeue() {
std::unique_lock<std::mutex> lock(mtx); // 加锁,确保线程安全
cond.wait(lock, [this] { return !queue.empty(); }); // 等待直到队列非空
int message = queue.front();
queue.pop();
return message;
}
private:
std::queue<int> queue; // 存储消息的队列
std::mutex mtx; // 互斥锁,保证线程安全
std::condition_variable cond; // 条件变量,用于线程间的同步
};
// 生产者线程函数
void producer(MessageQueue& mq) {
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间
mq.enqueue(i);
std::cout << "Produced: " << i << std::endl;
}
}
// 消费者线程函数
void consumer(MessageQueue& mq) {
for (int i = 0; i < 10; ++i) {
int message = mq.dequeue();
std::cout << "Consumed: " << message << std::endl;
}
}
int main() {
MessageQueue mq;
std::thread prod(producer, std::ref(mq));
std::thread cons(consumer, std::ref(mq));
prod.join();
cons.join();
return 0;
}
MessageQueue 类:实现了一个线程安全的消息队列。
enqueue(int message):向队列中添加消息,并通知等待的消费者线程。dequeue():从队列中取出消息,如果队列为空,则等待直到有消息可用。互斥锁和条件变量:
std::mutex:用于保护对共享资源(即队列)的访问,确保同一时刻只有一个线程可以修改队列。std::condition_variable:用于在生产者和消费者之间进行同步。当队列为空时,消费者线程会等待,直到生产者线程通知有新的消息可用。生产者和消费者线程:
producer 函数模拟生产者线程,每隔一段时间生成一个消息并放入队列。consumer 函数模拟消费者线程,从队列中取出消息并处理。main 函数:创建并启动生产者和消费者线程,最后等待它们完成。
这个示例展示了如何使用 C++ 实现一个简单的线程安全的消息队列,并通过生产者-消费者模式来演示其工作原理。
上一篇:c++中char的用法
下一篇:递归函数c++简单实例
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站