0

0

c++怎么使用条件变量实现生产者消费者模型_c++条件变量同步机制详解

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-04 19:55:02

|

388人浏览过

|

来源于php中文网

原创

使用条件变量实现生产者消费者模型,通过not_full和not_empty两个条件变量协调线程,生产者在缓冲区不满时添加数据并通知消费者,消费者在缓冲区不空时取出数据并通知生产者,结合互斥锁保护共享队列,避免竞争和虚假唤醒,确保线程安全与高效协作。

c++怎么使用条件变量实现生产者消费者模型_c++条件变量同步机制详解

在C++中,使用条件变量实现生产者消费者模型是一种典型的多线程同步问题。核心目标是让生产者线程在缓冲区满时等待,消费者线程在缓冲区空时等待,通过条件变量协调线程间的协作,避免资源竞争和无效轮询。

条件变量的基本机制

条件变量(std::condition_variable)通常与互斥锁(std::mutex)配合使用,用于阻塞线程直到某个条件成立。关键函数包括:

  • wait(lock, predicate):释放锁并阻塞线程,直到被唤醒且条件满足
  • notify_one():唤醒一个等待的线程
  • notify_all():唤醒所有等待的线程

使用条件变量时,必须配合互斥锁保护共享数据,防止竞态条件。

生产者消费者模型的实现步骤

假设有一个固定大小的缓冲区,多个生产者向其中添加数据,多个消费者从中取出数据。

立即学习C++免费学习笔记(深入)”;

实现要点:

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载
  • 定义共享缓冲区(如std::queue)并用互斥锁保护
  • 定义两个条件变量:not_full(缓冲区未满)和not_empty(缓冲区非空)
  • 生产者在插入前等待not_full,插入后通知not_empty
  • 消费者在取出前等待not_empty,取出后通知not_full

代码示例

以下是一个简单的C++实现:

#include 
#include 
#include 
#include 
#include 

std::queue buffer;
std::mutex mtx;
std::condition_variable not_full;
std::condition_variable not_empty;
const int max_size = 5;

void producer(int id) {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock lock(mtx);
        not_full.wait(lock, []{ return buffer.size() < max_size; });
        buffer.push(i);
        std::cout << "Producer " << id << " produced: " << i << "\n";
        not_empty.notify_all();
    }
}

void consumer(int id) {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock lock(mtx);
        not_empty.wait(lock, []{ return !buffer.empty(); });
        int value = buffer.front();
        buffer.pop();
        std::cout << "Consumer " << id << " consumed: " << value << "\n";
        not_full.notify_all();
    }
}

主函数中启动多个生产者和消费者线程即可看到交替执行的效果。

注意事项与常见问题

使用条件变量时需注意:

  • 始终在wait中使用谓词(predicate),防止虚假唤醒
  • 确保每次修改共享状态后正确调用notify
  • 避免死锁:不要在持有锁的情况下长时间执行其他操作
  • 选择notify_one还是notify_all取决于是否有多个线程等待同一条件

基本上就这些。合理使用条件变量能有效实现线程间同步,是掌握并发编程的重要一步。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

144

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

63

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

60

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

238

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

400

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号