c++ 线程安全与线程管理

C++11引入了标准库中的多线程支持,包括std::thread类和各种同步机制

  • 互斥锁std::mutex : 互斥锁用于保护共享资源,确保同一时间只有一个线程能够访问该资源,以防止数据竞争。

  • 条件变量std::condition_variable : 条件变量用于线程之间的通信,允许一个或多个线程等待某个条件(或者事件)的发生,而另一个线程则可以通知这些等待的线程该条件已经满足。

  • 原子操作std::atomic : 原子操作用于无锁编程,提供对基本数据类型的原子读写操作,防止数据竞争而无需显式的锁机制。

  • 信号量(Semaphore):用于控制对共享资源的访问,可以实现多个线程之间的同步和互斥。

  • 读写锁(Reader-Writer Lock):用于实现读写线程对共享数据的访问控制,允许多个读线程同时进行读操作,但只允许一个写线程进行写操作。

  • 屏障(Barrier):用于保证多个线程在某个点上同步,只有当所有线程都达到屏障点时才能继续执行。

  • 事件(Event):用于实现线程间的通信和同步,一个线程等待某个事件的发生,而另一个线程触发该事件。

  • 互斥量递归锁(Recursive Mutex):与互斥锁类似,但允许同一个线程多次获得同一个锁,避免死锁。

  • 读写互斥量(Read-Write Mutex):类似于读写锁,但使用互斥量来实现,可以更灵活地控制读写线程对共享数据的访问。

创建和管理线程

#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << message << std::endl;
}int main() {std::thread t1(printMessage, "Hello from thread 1");std::thread t2(printMessage, "Hello from thread 2");// 等待线程结束t1.join();t2.join();return 0;
}

使用互斥锁进行同步

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void printMessage(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);std::cout << message << std::endl;
}int main() {std::thread t1(printMessage, "Hello from thread 1");std::thread t2(printMessage, "Hello from thread 2");t1.join();t2.join();return 0;
}

使用条件变量进行线程间通信

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void printMessage() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; });std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(printMessage);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();t.join();return 0;
}

信号量(Semaphore):

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <semaphore.h>sem_t semaphore;void worker() {sem_wait(&semaphore); // 等待信号量std::cout << "执行任务" << std::endl;
}int main() {sem_init(&semaphore, 0, 0); // 初始化信号量为0std::thread t(worker);// 模拟一些操作std::this_thread::sleep_for(std::chrono::seconds(2));sem_post(&semaphore); // 发送信号量t.join();sem_destroy(&semaphore);return 0;
}

读写锁(Reader-Writer Lock):

#include

#include <thread>
#include <shared_mutex>std::shared_mutex rwMutex;
int data = 0;void reader() {std::shared_lock<std::shared_mutex> lock(rwMutex);std::cout << "读取数据:" << data << std::endl;
}void writer() {std::unique_lock<std::shared_mutex> lock(rwMutex);data++;std::cout << "写入数据:" << data << std::endl;
}int main() {std::thread readerThread1(reader);std::thread readerThread2(reader);std::thread writerThread(writer);readerThread1.join();readerThread2.join();writerThread.join();return 0;
}

屏障(Barrier):

#include <iostream>
#include <thread>
#include <barrier>std::barrier myBarrier(3); // 创建一个屏障,需要三个线程都到达后才能继续执行void worker() {// 模拟一些操作std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "执行任务" << std::endl;myBarrier.arrive_and_wait(); // 到达屏障并等待std::cout << "任务完成" << std::endl;
}int main() {std::thread t1(worker);std::thread t2(worker);std::thread t3(worker);t1.join();t2.join();t3.join();return 0;
}

事件(Event)

事件可以用于实现线程间的通信和同步,一个线程等待某个事件的发生,而另一个线程触发该事件。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool eventOccurred = false;void waitForEvent() {std::unique_lock<std::mutex> lock(mtx);while (!eventOccurred) {cv.wait(lock);}std::cout << "事件已发生,执行任务" << std::endl;
}void triggerEvent() {{std::lock_guard<std::mutex> lock(mtx);eventOccurred = true;}cv.notify_one();std::cout << "事件已触发" << std::endl;
}int main() {std::thread t1(waitForEvent);std::this_thread::sleep_for(std::chrono::seconds(2));std::thread t2(triggerEvent);t1.join();t2.join();return 0;
}

互斥量递归锁(Recursive Mutex)

互斥量递归锁允许同一个线程多次获得同一个锁,避免了死锁。

#include <iostream>
#include <thread>
#include <mutex>std::recursive_mutex mtx;void recursiveFunction(int depth) {std::lock_guard<std::recursive_mutex> lock(mtx);if (depth > 0) {std::cout << "递归深度:" << depth << std::endl;recursiveFunction(depth - 1);}
}int main() {recursiveFunction(3);return 0;
}

读写互斥量(Read-Write Mutex)

读写互斥量使用互斥量来实现,可以更灵活地控制读写线程对共享数据的访问。

#include <iostream>
#include <thread>
#include <mutex>std::mutex readMutex;
std::mutex writeMutex;
int data = 0;void reader() {std::lock_guard<std::mutex> lock(readMutex);std::cout << "读取数据:" << data << std::endl;
}void writer() {std::lock_guard<std::mutex> lock(writeMutex);data++;std::cout << "写入数据:" << data << std::endl;
}int main() {std::thread readerThread1(reader);std::thread readerThread2(reader);std::thread writerThread(writer);readerThread1.join();readerThread2.join();writerThread.join();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

埃特巴什码加解密小程序

埃特巴什码加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。 简单替换密码 Atbash Cipher 埃特巴什码(Atbash Cipher)其实可以视为下面要介绍的简单替换密码的特例&#xff0c;它使用字母表中的最后 一个字母代表第一个字母…

springboot学习01-[springboot介绍、配置文件介绍、自动配置读取原理]

springboot介绍、配置文件介绍、自动配置读取原理 springBoot学习代码说明为什么java -jar springJar包后项目就可以启动 配置文件介绍配置文件加载顺序其他约定配置文件加载顺序profile配置文件加载配置文件绑定类属性通过Value的方式进行属性注入通过ConfigurationProperties…

力扣62 不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 输入&…

【LC刷题】DAY16:530 501 236

【LC刷题】DAY16&#xff1a;530 501 236 文章目录 【LC刷题】DAY16&#xff1a;530 501 236530. 二叉搜索树的最小绝对差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索树中的众数236. 二叉树的最近公共祖先 [link](htt…

压缩文件夹的时候 找不到该文件或您没有读取该文件的权限。

在压缩文件夹时&#xff0c;出现 “找不到该文件或您没有读取该文件的权限” 错误&#xff0c;可能有以下几种原因和解决方法&#xff1a; 1. 文件不存在或路径错误 检查文件路径&#xff1a;确保文件路径正确且文件确实存在。 文件名和路径长度&#xff1a;Windows 对文件路…

FedCache 2.0引领联邦边缘学习性能与通信效率革新

FedCache 2.0引领联邦边缘学习性能与通信效率革新 在今天的数字化时代&#xff0c;边缘计算正迅速成为推动终端设备智能化的核心技术之一&#xff1b;如何在保证数据隐私的同时提高数据在网络边缘的处理效率和效果&#xff0c;已成为业界面临的一大挑战。最近&#xff0c;《Fe…

二分类问题中的性能指标【python,机器学习,算法】

平均绝对误差&#xff08;MAE&#xff09; 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09;是衡量模型预测误差的一种方法&#xff0c;通常用于回归分析。它表示的是预测值与真实值之间差的绝对值的平均数。计算公式如下&#xff1a; M A E 1 N ∑ i 1 N ∣…

MacOS 上安装和管理 Node.js

在 macOS 上安装和管理 Node.js&#xff0c;使用 Node Version Manager (NVM) 是一种简便且高效的方法。NVM 允许您轻松地安装、切换和管理不同版本的 Node.js。本指南将带您一步步完成这一过程。 步骤 1&#xff1a;安装 Node Version Manager (NVM) 首先&#xff0c;我们需…

电巢科技CIOE中国光博会:激光雷达技术应用研讨会圆满落幕!

2024年6月20日&#xff0c;由CIOE中国光博会与电巢科技联合主办的“激光雷达技术应用”线上研讨会成功举行。本次线上研讨会是CIOE中国光博会与电巢科技首次联合主办的论坛&#xff0c;旨在借助双方自身资源优势&#xff0c;为行业发展提供可靠的交流平台。接下来&#xff0c;C…

Android焦点机制结合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分发 开始&#xff1a; 讲三件事情&#xff1a; window的创建&#xff0c;更新焦点的更新事件的分发 Window的创建&#xff0c;更新&#xff1a; wi…

基于 Redis 实现秒杀资格判断,提升并发性能

在互联网电商平台上&#xff0c;秒杀活动往往会吸引大量用户同时抢购&#xff0c;如何高效地处理高并发请求&#xff0c;保证用户体验&#xff0c;是一个重要的技术挑战。本文将介绍如何基于 Redis 实现秒杀资格的判断&#xff0c;提高并发性能。 基本思路 秒杀活动的核心流程…

AI 编程还有前景嘛?

自从各个大厂相继出品 AI 编程助手之后&#xff0c;AI 在编程领域的发展&#xff0c;可谓是几无寸进。 相比于 AI 在多模态领域火热&#xff0c;AI 在编程领域的热度已经完全下来了。 阿七在公众号搜索了关键词「AI编程」&#xff0c;发现搜索出来的公众号寥寥无几&#xff0…

LLM生成模型在生物蛋白质应用:ESM3

参考&#xff1a; https://github.com/evolutionaryscale/esm 通过GPT模型原理&#xff0c;输入蛋白质序列等模态输出预测的蛋白质序列及结构 使用 参考&#xff1a;https://colab.research.google.com/github/evolutionaryscale/esm/blob/main/examples/generate.ipynb#sc…

(六)使用统计学方法进行变量有效性测试(43道选择题)

本文整理了使用统计学方法进行变量有效性测试相关的练习题&#xff0c;共43道&#xff0c;适用于想巩固理论基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;CDA二级-第7章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09;…

【无人机三维路径规划】基于树木生长算法TGA实现复杂城市地形下无人机避障三维航迹规划附Matlab代码

% 定义无人机起始位置和目标位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目标位置 [x, y, z] % 定义城市地形和障碍物信息 city_map imread(‘city_map.png’); % 城市地形图像 obstacles [ 20, 30, 10; % 障碍物1位置 [x, y, z] …

三分之一的违规行为未被发现

Gigamon 调查显示&#xff0c;随着漏洞的针对性越来越强、越来越复杂&#xff0c;企业在检测漏洞方面也面临越来越大的困难&#xff0c;超过三分之一的企业表示&#xff0c;现有的安全工具无法在漏洞发生时检测到它们。 随着混合云环境变得越来越复杂&#xff0c;以及恶意行为…

Java 语言特定指南

Java 语言特定指南 本 Java 入门指南将教您如何使用 Docker 创建一个容器化的 Spring Boot 应用程序。在本模块中&#xff0c;您将学习如何&#xff1a; 使用 Maven 容器化并运行一个 Spring Boot 应用程序设置本地开发环境以将数据库连接到容器、配置调试器&#xff0c;并使…

筛斗数据:引领未来,以技术创新推动在线推广新纪元

在数字化浪潮的推动下&#xff0c;企业在线推广已成为市场拓展的关键手段。然而&#xff0c;在海量信息中精准定位目标用户&#xff0c;有效提升转化率&#xff0c;却是一大挑战。筛斗数据&#xff0c;作为一家专注于数据提取与分析的技术公司&#xff0c;正以其独特的技术优势…

云计算基础知识

前言&#xff1a; 随着ICT技术的高速发展&#xff0c;企业架构对计算、存储、网络资源的需求更高&#xff0c;急需一种新的架构来承载业务&#xff0c;以获得持续&#xff0c;高速&#xff0c;高效的发展&#xff0c;云计算应运而生。 云计算背景 信息大爆炸时代&#xff1a…

Linux 标准IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符&#xff0c;一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…