std::queue<int> g_que; // 产品列表
std::mutex g_mu;
// 以厂家角度为中心,2个条件变量,一个判断是否可以卖产品,一个判断是否可以生产产品
std::condition_variable g_canSell; // 有产品,可以卖
std::condition_variable g_canProduct; // 可以生产产品
const int g_maxSize = 10; // 最大产品数目
// 生产产品
void producer() {
int i = 0;
while (true) // 不停的生产产品
{
// 建立一个互斥锁,并占用该互斥锁资源
std::unique_lock<std::mutex> locker(g_mu);
// 生产的产品已经满了
if (g_maxSize == g_que.size()) {
cout << " 生产产品已经满了,停止生产,等待客户购买" << endl;
// 可以生产产品的条件不满足,等待
// 直到生产产品的条件满足, 才可继续执行
g_canProduct.wait(locker);
}
++i;
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 生产产品
g_que.push(i);
cout << " 生产好了产品" << i << endl;
locker.unlock();
// 产品已经生产好了,可以购买了
// 类似与信号与槽机制中的,类似于发送了一个能卖产品的消息给了相应的另一个线程
g_canSell.notify_one();
}
}
// 卖产品给客户
void consumer() {
while (true) // 不停的卖产品给客户
{
std::unique_lock<std::mutex> locker(g_mu
c++11 多线程 生产者 消费者
最新推荐文章于 2023-07-05 15:46:30 发布
本文详细介绍了如何使用C++11的新特性来实现经典的生产者消费者问题。通过示例代码展示了如何利用std::mutex进行同步,std::condition_variable进行条件等待,以及std::queue作为缓冲区,来实现多线程间的协作。讨论了线程安全的数据共享以及避免死锁的方法。
摘要由CSDN通过智能技术生成