【现代C++】线程支持库
现代C++(C++11及其之后的版本)引入了标准的线程支持库,使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。
1. std::thread
- 基本线程
std::thread
允许创建执行特定任务的线程。
#include <iostream>
#include <thread>void helloFunction() {std::cout << "Hello from thread!" << std::endl;
}void basicThread() {std::thread t(helloFunction);t.join(); // 等待线程完成
}
2. 传递参数给线程函数
线程函数可以接受参数,和普通函数一样。
#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << message << std::endl;
}void threadWithArguments() {std::thread t(printMessage, "Hello from thread with argument!");t.join();
}
3. std::mutex
- 互斥量
互斥量用于同步对共享资源的访问。
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void printBlocked(const std::string& message) {mtx.lock();std::cout << message << std::endl;mtx.unlock();
}void mutexExample() {std::thread t1(printBlocked, "Thread 1");std::thread t2(printBlocked, "Thread 2");t1.join();t2.join();
}
4. std::lock_guard
- 自动管理互斥量
std::lock_guard
提供了一种便捷的RAII风格的方式来自动上锁和解锁互斥量。
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void safePrint(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);std::cout << message << std::endl;// 互斥量在lock_guard对象被销毁时自动解锁
}void lockGuardExample() {std::thread t1(safePrint, "Thread 1 with lock_guard");std::thread t2(safePrint, "Thread 2 with lock_guard");t1.join();t2.join();
}
5. std::async
和std::future
- 异步执行
std::async
允许异步执行函数,并通过std::future
获取结果。
#include <iostream>
#include <future>int compute() {return 42; // 模拟计算
}void asyncExample() {std::future<int> result = std::async(compute);std::cout << "The answer is " << result.get() << std::endl;
}
6. std::condition_variable
- 条件变量
条件变量用于线程间的同步,允许线程在特定条件下等待或通知其他线程。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void printId(int id) {std::unique_lock<std::mutex> lock(mtx);while (!ready) cv.wait(lock);std::cout << "Thread " << id << std::endl;
}void go() {std::unique_lock<std::mutex> lock(mtx);ready = true;cv.notify_all();
}void conditionVariableExample() {std::thread threads[10];for (int i = 0; i < 10; ++i) {threads[i] = std::thread(printId, i);}std::cout << "10 threads ready to race..." << std::endl;go();for (auto& t : threads) {t.join();}
}
相关文章:

【现代C++】线程支持库
现代C(C11及其之后的版本)引入了标准的线程支持库,使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…...

游戏引擎架构01__引擎架构图
根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ...
[Java、Android面试]_15_Android为什么使用Binder?
Android为什么使用Binder?用 Linux原有的IPC不行吗? 本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天…...

Python+Selenium+Unittest 之Unittest3(TestSuite()和TextTestRunner())
目录 1:addTest() 2、addTests() 3:discover() 上一篇说了Unittest的一个基本的执行顺序,那如果我们想要调整用例的执行先后顺序的话,可以用TestSuite()和TextTestRunner()了,可以这么理解,比如一个班级…...

3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?
HOOPS Visualize是一个开发平台,可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括: 高性能、以工程为中心的可视化,使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口,内部利用…...
Vue探索之Vue2.x源码分析(二)
一.Virtual Dom 虚拟DOM是一种轻量级的抽象,它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。 Vue的虚拟dom是一种抽象层的概念,它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结…...

人工智能分类算法概述
文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式,将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用,如图…...

理解 Golang 变量在内存分配中的规则
为什么有些变量在堆中分配、有些却在栈中分配? 我们先看来栈和堆的特点: 简单总结就是: 栈:函数局部变量,小数据 堆:大的局部变量,函数内部产生逃逸的变量,动态分配的数据&#x…...

《QT实用小工具·二十四》各种数学和数据的坐标演示图
1、概述 源码放在文章末尾 该项目实现了各种数学和数据的坐标演示图,下面是demo演示: 项目部分代码如下: #ifndef FRMMAIN_H #define FRMMAIN_H#include <QWidget> class QAbstractButton;namespace Ui { class frmMain; }class fr…...
【S32K3 MCAL配置】-3.1-CANFD配置-经典CAN切换CANFD(基于MCAL+FreeRTOS)
"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录(共5页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作:...

IEC101、IEC103、IEC104、Modbus报文解析工具
一、概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用。为适应网络传输,2000年IEC TC57又出版了IEC 60870-5-104:2000《远东设备及系统 第5-104部分:传输规约-采…...

node res.end返回json格式数据
使用 Node.js 内置 http 模块的createServer()方法创建一个新的HTTP服务器并返回json数据,代码如下: const http require(http);const hostname 127.0.0.1; const port 3000;const data [{ name: 测试1号, index: 0 },{ name: 测试2号, index: 1 },…...

产品开发流程
产品开发流程 时间:2024年04月10日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 产品开发流程_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅欢迎收听小蒋聊技术的类最新章节声音“产品开发流程”。时间:…...
Python蓝桥杯赛前总结
1.进制转换 (1) 2进制转换为其他进制 # 2转10 int(n, 2) # 2转8 oct(int(n, 2)) # 2转16 hex(int(n, 2)) (2) 8进制转换为其他进制 #8转10 int(n, 8) #8转2 bin(int(n, 8)) #8转16 hex(int(n, 8)) (3) 10进制转换为其他进制 #10转2 bin(n) #10转8 oct(n) #10转16 hex(n) …...

20240326-1-KNN面试题
KNN面试题 1.简述一下KNN算法的原理 KNN算法利用训练数据集对特征向量空间进行划分。KNN算法的核心思想是在一个含未知样本的空间,可以根据样本最近的k个样本的数据类型来确定未知样本的数据类型。 该算法涉及的3个主要因素是:k值选择,距离度…...

【论文速读】| MASTERKEY:大语言模型聊天机器人的自动化越狱
本次分享论文为:MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots 基本信息 原文作者:Gelei Deng, Yi Liu, Yuekang Li, Kailong Wang, Ying Zhang, Zefeng Li, Haoyu Wang, Tianwei Zhang, Yang Liu 作者单位:南洋理工…...
jvm运行情况预估
相关系统 jvm优化原则-CSDN博客 执行下面指令 jstat gc -pid 能计算出一些关键数据,有了这些数据,先给JVM参数一些的初始的,比堆内存大小、年轻代大小 、Eden和Srivivor的比例,老年代的大小,大对象的阈值,…...

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析
目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点: 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…...

Python:如何对FY3D TSHS的数据集进行重投影并输出为TIFF文件以及批量镶嵌插值?
完整代码见 Github:https://github.com/ChaoQiezi/read_fy3d_tshs,由于代码中注释较为详细,因此博客中部分操作一笔带过。 01 FY3D的HDF转TIFF 1.1 数据集说明 FY3D TSHS数据集是二级产品(TSHS即MWTS/MWHS 融合大气温湿度廓线/稳定度指数/…...

CentOS 镜像下载
CentOS 镜像下载:https://www.centos.org/download/ 选择合适的架构,博主选择x86_64,表示CentOS7 64位系统x86架构,如下: 或者直接访问以下网站下载 清华大学开源软件镜像站:https://mirrors.tuna.tsin…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...