#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
std::queue<int> message_queue; // 消息队列
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
// 消费者线程函数,用于从消息队列中取出数据并进行处理
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []() { return !message_queue.empty(); }); // 等待条件变量,直到消息队列不为空
int message = message_queue.front(); // 取出消息队列的头部数据
message_queue.pop(); // 弹出头部数据
lock.unlock(); // 解锁互斥锁
std::cout << "Consume message: " << message << std::endl; // 处理消息
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟处理消息的时间
}
}
// 生产者线程函数,用于向消息队列中添加数据
void producer() {
for (int i = 0; i < 5; ++i) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟生产消息的时间
std::unique_lock<std::mutex> lock(mtx);
message_queue.push(i); // 将数据压入消息队列
lock.unlock(); // 解锁互斥锁
cv.notify_one(); // 通知条件变量,有新的数据产生
}
}
int main() {
std::thread c(consumer); // 创建消费者线程
std::thread p(producer); // 创建生产者线程
c.join();
p.join();
return 0;
}
用mutex和condition_variable完成多线程操作
于 2023-05-02 22:40:00 首次发布