当前位置: 首页 > 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';}

相关文章:

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

一&#xff1a;概述 线程同步是多线程编程中的一个重要概念&#xff0c;它用于控制多个线程之间对共享资源的访问&#xff0c;避免竞态条件&#xff08;race condition&#xff09;和数据不一致的问题。线程同步确保在多线程环境中&#xff0c;多个线程访问共享数据时能够按照某…...

使用Python脚本进行编写批量根据源IP进行查询的语句用于态势感知攻击行为的搜索

使用Python脚本进行编写批量根据源IP进行查询的语句 以下根据ip-list集里面的IP地址&#xff08;可以自行扩充&#xff09;&#xff0c;然后采用srcaddress "{ip}" or 的形式进行打印并存储在路径为&#xff1a;桌面的IOC结果.txt --------------------------代码如…...

Python中的zip/unzip:像拉拉链一样组合数据的艺术

今天让我们一起探讨Python中一个优雅而强大的内置功能&#xff1a; zip 和 unzip 。听名字就知道&#xff0c;它就像我们衣服上的拉链一样&#xff0c;能把两边的数据完美地咬合在一起。 从一个有趣的例子开始 想象你正在开发一个班级管理系统。每个学生都有名字、成绩和评语…...

数电课设·简易数字钟(Quartus Ⅱ)

忽如一夜春风来&#xff0c;千树万树梨花开 —— 《白雪歌诵武判官归京》 岑参 【唐】 目录 简易数字钟 要点剖析&#xff1a; 逐步分析&#xff1a; 端口说明&#xff1a; 代码展示&#xff1a; 分部解释&#xff1a; 代码编译结果&#xff1a; 提醒 &#xff1a; …...

大模型中RAG模型的检索过程是如何实现的?(附最佳实践资料)

RAG模型的检索过程主要涉及以下几个步骤&#xff1a; 向量化&#xff08;Embedding&#xff09;&#xff1a;首先&#xff0c;需要将外部知识库中的文档转换为计算机能够理解的向量形式。这一步骤通常使用预训练的嵌入模型&#xff08;如BERT、GPT等&#xff09;将文本转换为高…...

python:用 sklearn.metrics 评价 K-Means 聚类模型

sklearn 的 metrics 模块提供的聚类模型评价指标如下&#xff1a; ARI 评价法&#xff08;兰德系数&#xff09;: adjusted_rand_score AMI 评价法&#xff08;相互信息&#xff09;: adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…...

Spring依赖注入不同类型的数据

目录 前言 回顾 注入集合 List与set集合 Map集合 前言 前面学习依赖注入时注入的都是对象&#xff0c;这里记录注入的值为集合的情况 回顾 在注入的时候&#xff0c;如果要注入的属性的值为字符串或基本数据类型&#xff0c;用value即可&#xff1b;如果要注入一个对象的…...

Linux大杂烩!!!

Linux 命令大全 https://www.runoob.com/linux/linux-command-manual.html Linux下打印ASCII字符 ASCII码对照表及转换器 [rootuntifa_80 ~]# printf "\x30\n" 0 [rootuntifa_80 ~]# echo -e "\u0030" 0tar、gzip 打包解压命令 参考文章&#xff1a;ta…...

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…...

C语言——实现杨氏矩阵

什么是杨氏矩阵&#xff1f; 概念&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的 eg&#xff1a; 1 2 3 4 5 6 7 8 9 题目&#xff1a; 请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复…...

授权模型PAM

PAM&#xff08;Privileged Access Management&#xff09;是一种授权模型&#xff0c;用于管理和控制特权用户的访问权限。PAM的目标是确保特权用户只能在需要时获得所需的特权&#xff0c;并且他们的活动得到适当的监控和审计。 PAM的核心思想是将特权访问权限视为一种受限的…...

【Leecode】子集⭐⭐

子集 [78]子集I 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例输入 示例 1&#xff1a; 输入&#xff1a;nums [1, 2, 3…...

Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程

12. 多线程编程 注&#xff1a;博客中有书中没有的内容&#xff0c;均是来自 黑马06-线程概念_哔哩哔哩_bilibili 早期Linux不支持线程&#xff0c;直到1996年&#xff0c;Xavier Leroy等人开发出第一个基本符合POSIX标准的线程库LinuxThreads&#xff0c;但LinuxThreads效率…...

[HNCTF 2022 Week1]baby_rsa

源代码&#xff1a; from Crypto.Util.number import bytes_to_long, getPrime from gmpy2 import * from secret import flag m bytes_to_long(flag) p getPrime(128) q getPrime(128) n p * q e 65537 c pow(m,e,n) print(n,c) # 62193160459999883112594854240161159…...

解析Java中的Stream API:函数式编程与性能优化

自Java 8以来&#xff0c;Java语言引入了Stream API&#xff0c;为开发者提供了一种全新的数据处理方式。Stream API支持函数式编程风格&#xff0c;使得对集合、数组、IO流等数据源的操作更加简洁、直观且具有高效的性能优势。通过Stream API&#xff0c;我们可以在不修改原有…...

java简单题目练习

大家好&#xff0c;今天我们不学习新的内容&#xff0c;今天给大家分享一些简单的java算法题供大家练练手&#xff0c;那么我们下面就来看看。 那么大家下去练习一下&#xff0c;我们明天继续讲解类和对象的相关知识&#xff0c;谢谢大家&#xff01;&#xff01;&#xff01;...

Kaggler日志--Day9

进度24/12/18 昨日复盘&#xff1a; 补充并解决Day7Kaggler日志–Day7统计的部分问题 今日进度&#xff1a; 继续完成Day8Kaggler日志–Day8统计问题的解答 明日规划&#xff1a; 今天报名了Regression with an Insurance Dataset算是新手村练习比赛&#xff0c;截止时间是2…...

OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+

漏洞库在企业中扮演着至关重要的角色&#xff0c;不仅提升了企业的安全防护能力&#xff0c;还支持了安全决策、合规性要求的满足以及智能化管理的发展。前期博文《业界十大知名权威安全漏洞库介绍》介绍了主流漏洞库&#xff0c;今天给大家介绍一款集成了多款漏洞库的开源漏洞…...

麒麟信安参编的《能源企业数字化转型能力评价 技术可控》团体标准发布

近日&#xff0c;中国能源研究会发布公告&#xff0c;《能源企业数字化转型能力评价 技术可控》团体标准发布。该标准由麒麟信安与国网湖北省电力有限公司武汉供电公司、国网智能电网研究院有限公司、中能国研&#xff08;北京&#xff09;电力科学研究院等单位联合编制。 《能…...

戴尔物理机更换完Raid控制器(阵列卡),启动服务器失败

背景 我们使用的物理机是戴尔的POWEREDGE R730机器&#xff0c;由于硬件损坏导致该问题的延申&#xff0c;再更换完Raid的控制器&#xff08;阵列卡&#xff09;之后导致启动服务器报错。 报错&#xff1a; There are offline or missing virtual drives with preserved cac…...

nRF52832蓝牙开发实战:手把手教你配置广播与扫描(基于SES和nRF5 SDK 15.3)

nRF52832蓝牙开发实战&#xff1a;从零配置广播与扫描全流程解析 在物联网设备开发中&#xff0c;蓝牙低功耗&#xff08;BLE&#xff09;技术因其低功耗、低成本的特点成为连接智能设备的首选方案。作为Nordic Semiconductor的明星产品&#xff0c;nRF52832凭借其强大的处理能…...

农业遥感避坑指南:用大疆P4M多光谱数据生成NDVI,选智图还是Metashape?

农业遥感实战&#xff1a;大疆P4M多光谱数据NDVI生成工具选型指南 站在农田边缘&#xff0c;手持大疆精灵4多光谱版&#xff08;P4M&#xff09;遥控器的你&#xff0c;刚刚完成了一次作物长势监测飞行。无人机带回的宝贵数据&#xff0c;正等待转化为直观的NDVI图——这张&quo…...

适合自动化测试练习的免费 API 清单

免费接口-聚合网站 https://www.juhe.cn/ 适合自动化测试练习的免费 API 清单,按场景分类,覆盖 REST/GraphQL、状态码验证、自定义 Mock 与真实数据,可直接用于接口测试(含 Python+pytest)练习。 一、核心免费 API 清单(按场景) 表格 名称 类型 核心用途 特点 访问方式…...

2026年AI就业风口!这5个神仙岗位,高薪低门槛,普通人也能转行!

根据LinkedIn数据&#xff0c;2026年AI相关岗位增长迅猛&#xff0c;其中AI咨询顾问、机器学习工程师、AI产品经理、数据与检索工程师等岗位需求旺盛&#xff0c;且部分岗位对计算机科学学位要求不高。文章详细介绍了这5个岗位的火热原因、转行路径及薪资范围&#xff0c;并给出…...

像素特工上线!Ostrakon-VL零售扫描终端开源部署全流程

像素特工上线&#xff01;Ostrakon-VL零售扫描终端开源部署全流程 1. 项目概览&#xff1a;当AI遇见像素艺术 在零售和餐饮行业&#xff0c;传统的图像识别系统往往采用单调的工业界面&#xff0c;操作体验枯燥乏味。今天我们要介绍的"像素特工"项目&#xff0c;彻…...

如何正确计算 CSV 文件中每行学生成绩的平均值

本文详解 python 中使用 csv 模块处理学生成绩数据时常见的累积错误&#xff0c;并提供结构清晰、健壮可靠的解决方案&#xff0c;重点解决因变量作用域不当导致的平均值计算失真问题。在使用 Python 的 csv 模块逐行读取学生成绩文件&#xff08;如 "students.csv"&…...

StructBERT中文情感识别效果展示:电影评论情感极性与票房相关性验证

StructBERT中文情感识别效果展示&#xff1a;电影评论情感极性与票房相关性验证 1. 项目概述与背景 StructBERT 情感分类 - 中文 - 通用 base 是百度基于 StructBERT 预训练模型微调后的中文通用情感分类模型&#xff0c;专门用于识别中文文本的情感倾向。这个模型在中文 NLP…...

春招已经过半,这一波再不动手,基本就没位置了

关注 霍格沃兹测试学院公众号&#xff0c;回复「资料」&#xff0c;领取人工智能测试开发技术合集导读3月底这个时间点&#xff0c;如果你还在纠结“要不要投”&#xff0c;那基本已经慢半拍了。现在的真实情况是&#xff1a;大厂已经进入筛选面试并行阶段一部分公司已经开始发…...

HY-MT1.5-1.8B功能体验:格式保留翻译,完美处理srt字幕和网页标签

HY-MT1.5-1.8B功能体验&#xff1a;格式保留翻译&#xff0c;完美处理srt字幕和网页标签 1. 引言&#xff1a;翻译模型的新挑战 在全球化内容爆炸式增长的今天&#xff0c;传统翻译工具面临两大核心痛点&#xff1a; 格式丢失问题&#xff1a;翻译srt字幕、HTML网页等内容时…...

二、空间碎片聚类-轨道计算与J2000坐标系实现

1. 整体思路 在空间碎片监测、卫星对地观测等任务中,需要精确知道卫星和空间目标在某一时刻的位置。通常我们使用开普勒轨道六要素(半长轴、偏心率、倾角、升交点赤经、近地点幅角、真近点角)来描述轨道,并通过轨道动力学外推得到任意时刻的位置。本文实现了一套基于J2000…...