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

C++ 并发专题 - C++线程同步的几种方法

一:概述

        线程同步是多线程编程中的一个重要概念,它用于控制多个线程之间对共享资源的访问,避免竞态条件(race condition)和数据不一致的问题。线程同步确保在多线程环境中,多个线程访问共享数据时能够按照某种预定的顺序或规则进行,以保证程序的正确性和稳定性。

二:线程同步方法

        1. 信号量


#include <iostream>
#include <semaphore>
#include <thread>
#include <vector>std::vector<int> myVec{};std::counting_semaphore<1> prepareSignal(0);void prepareWork() {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout << "Sender: Data prepared."  << '\n';prepareSignal.release();
}void completeWork() {std::cout << "Waiter: Waiting for data." << '\n';prepareSignal.acquire();myVec[2] = 2;std::cout << "Waiter: Complete the work." << '\n';for (auto i: myVec) std::cout << i << " ";std::cout << '\n';}int main() {std::cout << '\n';std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout << '\n';}

        2. 条件变量

#include <iostream>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <vector>std::mutex mut;
std::condition_variable condVar;std::vector<int> myVec{};void prepareWork() {                                       {std::lock_guard<std::mutex> lck(mut);myVec.insert(myVec.end(), {0, 1, 0, 3});           }std::cout << "Sender: Data prepared."  << '\n';condVar.notify_one();
}void completeWork() {                                       std::cout << "Waiter: Waiting for data." << '\n';std::unique_lock<std::mutex> lck(mut);condVar.wait(lck, [] { return not myVec.empty(); });myVec[2] = 2;                                           std::cout << "Waiter: Complete the work." << '\n';for (auto i: myVec) std::cout << i << " ";std::cout << '\n';}int main() {std::cout << '\n';std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout << '\n';}

        3. Atomic


#include <atomic>
#include <iostream>
#include <thread>
#include <vector>std::vector<int> myVec{};std::atomic<bool> atomicBool{false};void prepareWork() {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout << "Sender: Data prepared."  << '\n';atomicBool.store(true);atomicBool.notify_one();}void completeWork() {std::cout << "Waiter: Waiting for data." << '\n';atomicBool.wait(false);                                myVec[2] = 2;std::cout << "Waiter: Complete the work." << '\n';for (auto i: myVec) std::cout << i << " ";std::cout << '\n';}int main() {std::cout << '\n';std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout << '\n';}

        4. Promise - Feature 

#include <iostream>
#include <future>
#include <thread>
#include <vector>std::vector<int> myVec{};void prepareWork(std::promise<void> prom) {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout << "Sender: Data prepared."  << '\n';prom.set_value();                                    }void completeWork(std::future<void> fut){std::cout << "Waiter: Waiting for data." << '\n';fut.wait();                                           myVec[2] = 2;std::cout << "Waiter: Complete the work." << '\n';for (auto i: myVec) std::cout << i << " ";std::cout << '\n';}int main() {std::cout << '\n';std::promise<void> sendNotification;auto waitForNotification = sendNotification.get_future();std::thread t1(prepareWork, std::move(sendNotification));std::thread t2(completeWork, std::move(waitForNotification));t1.join();t2.join();std::cout << '\n';}

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

相关文章:

  • 使用Python脚本进行编写批量根据源IP进行查询的语句用于态势感知攻击行为的搜索
  • Python中的zip/unzip:像拉拉链一样组合数据的艺术
  • 数电课设·简易数字钟(Quartus Ⅱ)
  • 大模型中RAG模型的检索过程是如何实现的?(附最佳实践资料)
  • python:用 sklearn.metrics 评价 K-Means 聚类模型
  • Spring依赖注入不同类型的数据
  • Linux大杂烩!!!
  • 12.19问答解析
  • C语言——实现杨氏矩阵
  • 授权模型PAM
  • 【Leecode】子集⭐⭐
  • Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程
  • [HNCTF 2022 Week1]baby_rsa
  • 解析Java中的Stream API:函数式编程与性能优化
  • java简单题目练习
  • Kaggler日志--Day9
  • OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+
  • 麒麟信安参编的《能源企业数字化转型能力评价 技术可控》团体标准发布
  • 戴尔物理机更换完Raid控制器(阵列卡),启动服务器失败
  • 计算机基础知识——数据结构与算法(二)(山东省大数据职称考试)
  • docsify
  • GEE教程——使用 CHIRPS 和 GSMaP 数据集计算并可视化了特定区域的降水量
  • 前端实现页面自动播放音频方法
  • 【Nginx-5】Nginx 限流配置指南:保护你的服务器免受流量洪峰冲击
  • 【芯片设计- RTL 数字逻辑设计入门 番外篇 7.1 -- 基于ATE的IC测试原理】
  • SurfaceFlinger 学习
  • Flink SQL 从一个SOURCE 写入多个Sink端实例
  • python飞机大战游戏.py
  • 【C++】14___String容器
  • 数据特性库 前言