当前位置: 首页 > news >正文

【C++】 条件变量实现线程同步示例

在做一些比较大的项目的时候,需要实现线程同步, 这里结合一个小示例,进行线程同步的讲解

问题定义

以下是一个使用 C++ 多线程和条件变量的示例,展示了线程 A 接收一个 enable 信号并通知线程 B 开始工作。线程 B 在开始工作之前将 enable 信号设置为 false,然后执行其任务。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>// 共享数据
std::atomic<bool> enable(false);
std::mutex mtx;
std::condition_variable cv;void threadA() {// 模拟接收 enable 信号std::this_thread::sleep_for(std::chrono::seconds(1));{std::lock_guard<std::mutex> lock(mtx);enable = true;}std::cout << "Thread A: enable signal received. Notifying thread B." << std::endl;cv.notify_one(); // 通知线程 B
}void threadB() {std::unique_lock<std::mutex> lock(mtx);// 等待 enable 信号cv.wait(lock, [] { return enable.load(); });std::cout << "Thread B: Received notification. Setting enable to false." << std::endl;enable = false; // 将 enable 信号设置为 false// 进行工作std::cout << "Thread B: Working..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作std::cout << "Thread B: Work done." << std::endl;
}int main() {std::thread tA(threadA);std::thread tB(threadB);tA.join();tB.join();return 0;
}

代码说明

  1. 共享数据
    • enable:使用 std::atomic<bool> 进行原子操作,确保线程安全。
    • mtx:互斥锁,用于保护共享数据。
    • cv:条件变量,用于线程之间的同步。
  2. **threadA**** 函数**:
    • 模拟接收 enable 信号。
    • 设置 enabletrue,表示信号已接收。
    • 通知线程 B。
  3. **threadB**** 函数**:
    • 等待 enable 信号。条件变量 cv.wait 保证线程在 enabletrue 之前不会继续执行。
    • 在接收到通知后,将 enable 设置为 false
    • 执行其任务。
  4. **main**** 函数**:
    • 创建并启动线程 A 和线程 B。
    • 等待线程 A 和线程 B 完成。

这个示例展示了如何使用条件变量和原子变量进行线程间的同步和数据共享。

http://www.lryc.cn/news/410978.html

相关文章:

  • linux下载redis安装并指定配置文件启动
  • 线性结构、线性表、顺序表、链表、头插法、尾插法、中间插入或删除一个节点
  • C# Task.WaitAll 的用法
  • vue2 前端实现pdf在线预览(无插件版)
  • 排序XXXXXXXXX
  • 【文件解析漏洞】实战详解!
  • 【杂谈】学会让你节省三秒钟——Dev-c++的缺省源
  • 推荐一款前端滑动验证码插件(Vue、uniapp)
  • 【Git】git stash
  • 不得不安利的程序员开发神器,太赞了!!
  • 吴恩达机器学习C1W2Lab06-使用Scikit-Learn进行线性回归
  • CSS实现表格无限轮播
  • 编程小白如何从迷茫走出
  • 14 B端产品的运营管理
  • STM32_RTOS学习笔记——1(列表与列表项)
  • 子网划分案例
  • javaweb_02:Maven
  • 19.延迟队列优化
  • P10477 Subway tree systems 题解,c++ 树相关题目
  • 18.jdk源码阅读之CopyOnWriteArrayList
  • 美股:AMD展现乐观前景,挑战AI加速器市场霸主
  • 如何提高计算机视觉技术在复杂环境和低光照条件下的物体识别准确率?
  • ubuntu cmake使用自己版本的qt
  • Python基础知识笔记---保留字
  • Python面试整理-Web开发
  • 民大食堂用餐小程序的设计
  • Linux系统编程(4):消息队列
  • 【初阶数据结构篇】单链表的实现(赋源码)
  • LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)
  • 昇思MindSpore 应用学习-基于 MindSpore 实现 BERT 对话情绪识别