C++:线程库的使用
文章目录
- Windows和Linux平台的线程
- 线程
- 构造函数
- 模板参数包
最近发现C++11的线程库还没有进行总结,因此本篇对于C++11当中新增的线程库的一些基本用法进行总结
Windows和Linux平台的线程
在Linux平台下是存在一些原生的线程系统调用的,比如有pthread_create这样的系统调用,而在C++11标准之后,C++自己的标准库中也出现了有关线程的调用库,这样最大的好处就是只要使用的是C++提供的线程库,这样不管是在Linux下还是在Windows下都是可以使用的,提供了一个跨平台的好处,因为这本身是属于语言本身的
对于线程库当中的实现,其实就是把这样的类unix平台的接口和Windows的原生接口进行了一个条件编译,当检测到时WIN32的系统的时候,就使用的是Windows提供的原生的线程,而如果识别到时unix的系统,就使用unix提供的线程,具体可以理解为下面这样
#ifdef _WIN32
CreateThread()
#else
pthread_create()
#endif
线程
C++语言本身提供的这个线程,是一个用类进行封装的线程:

也提供了一些成员函数

构造函数
对于一个类来说,首先要看一下它的构造函数,看一下可以用什么样的方法来构造出这个函数

在上面的这四种构造函数中出现了一些熟悉的身影,默认构造函数是一个无参的构造函数,表示的是一个空线程,不启动,其次是一个模板,在这个模板中带有的是一个可变参数包,并且还有万能引用等,这些后续进行代码实践,需要注意的是其中的Fn表示的是一个可执行对象,可以是函数指针,仿函数,lambda表达式,包装器等等
从下面的拷贝函数可以看出,线程不支持拷贝构造,但是支持移动构造
模板参数包
为什么要诞生出这个模板参数包来进行构造函数?先看看Linux下的线程创建是怎么创建的

如图所示的是Linux下的线程创建的系统调用,第一个参数是线程的tid,这里就不多介绍了,重点是后面的函数指针,后面的arg表示的是函数指针的参数,那这就意味着会用到强转这样的信息来进行参数的解析,如果使用原生的方式要传递多个参数,通常要把这些信息放到一个结构体当中:
#include <iostream>
#include <unistd.h>
#include <string>
using namespace std;struct thread_data
{thread_data(const string &message, int id) : _message(message), _id(id) {}string _message;int _id;
};void *routine(void *arg)
{struct thread_data *td = (struct thread_data *)arg;cout << td->_message << " : " << td->_id << endl;return nullptr;
}int main()
{pthread_t tid;for (int i = 0; i < 5; i++){thread_data td("这是线程", i);pthread_create(&tid, nullptr, &routine, (void *)&td);pthread_join(tid, nullptr);}return 0;
}
而在C++11的库当中,如果使用这个模板参数包,就可以很方便的直接进行使用了:
#include <iostream>
#include <thread>
#include <windows.h>
#include <functional>
using namespace std;void func1(const string& message, int id)
{cout << message << " " << id << endl;
}struct func3
{void operator()(const string& message, int id){cout << message << " " << id << endl;}
};int main()
{// 使用函数指针string tmp1 = "这是函数指针的方法";int id1 = 1;thread t1(&func1, tmp1, id1);Sleep(1000);// 使用lambda表达式string tmp2 = "这是lambda的方法";int id2 = 2;thread t2([&](const string& message, int id) {cout << message << " " << id << endl;}, tmp2, id2);Sleep(1000);// 使用仿函数string tmp3 = "这是仿函数的方法";int id3 = 3;func3 f3;thread t3(f3, tmp3, id3);Sleep(1000);// 使用包装器function<void(const string&, int)> func4 = func1;string tmp4 = "这是包装器的方法";int id4 = 4;thread t4(func4, tmp4, id4);Sleep(1000);// 回收等待t1.join();t2.join();t3.join();t4.join();return 0;
}
如上所示是四种可执行方式调用线程的方式
相关文章:
C++:线程库的使用
文章目录 Windows和Linux平台的线程线程构造函数模板参数包 最近发现C11的线程库还没有进行总结,因此本篇对于C11当中新增的线程库的一些基本用法进行总结 Windows和Linux平台的线程 在Linux平台下是存在一些原生的线程系统调用的,比如有pthread_creat…...
机器学习模型:决策树笔记
第一章:决策树原理 1-决策树算法概述_哔哩哔哩_bilibili 根节点的选择应该用哪个特征?接下来选什么?如何切分? 决策树判断顺序比较重要。可以使用信息增益、信息增益率、 在划分数据集前后信息发生的变化称为信息增益,…...
20.2k stars项目搭建私人网盘界面美功能全
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放源代码软件,每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…...
卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用
前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…...
Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别
在PyTorch中,torch.from_numpy()函数和.float()方法被用来从NumPy数组创建张量,并可能改变张量的数据类型。两者之间的区别主要体现在数据类型的转换上: torch.from_numpy(X_train):这行代码将NumPy数组X_train转换为一个PyTorch张…...
深度学习pytorch好用网站分享
深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f...
C语言 | Leetcode C语言题解之第2题两数相加
题目: 题解: struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …...
Oracle基础
Oracle基础 Oracle,作为全球最大的数据库软件供应商,其数据库产品在企业级应用市场中占据了举足轻重的地位。Oracle数据库以高性能、高可用性、高安全性以及强大的数据管理能力赢得了广泛认可。本文旨在为读者提供Oracle数据库的基础知识,帮…...
从0到1实现RPC | 04 负载均衡和静态注册中心
一、Router的定义 Router路由用于预筛选,Dubbo有这样的设计,SpringCloud没有。 二、LoadBanlancer定义 负载均衡器:默认取第一个 当前支持随机和轮询两种负载均衡器。 随机:从所有provider中随机选择一个。 轮询:每…...
卷积神经网络-池化层
卷积神经网络-池化层 池化层(Pooling Layer)是深度学习神经网络中的一个重要组成部分,通常用于减少特征图的空间尺寸,从而降低模型复杂度和计算量,同时还能增强模型的不变性和鲁棒性。 池化操作通常在卷积神经网络&am…...
【干货集】C# XmlHelper帮助类操作Xml文档的通用方法汇总
前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内容增删改的一些通过方法)。当然可…...
Coursera自然语言处理专项课程04:Natural Language Processing with Attention Models笔记 Week01
Natural Language Processing with Attention Models Course Certificate 本文是学习这门课 Natural Language Processing with Attention Models的学习笔记,如有侵权,请联系删除。 文章目录 Natural Language Processing with Attention ModelsWeek 01…...
mysql MHA高可用
目录 工作原理 Node(节点) Manager(管理器) Node和Manager的协作 故障转移流程 优势 配置和管理 配置主从复制 MHA实现高可用 MySQL Master High Availability(MHA)是一个开源的高可用性解决方案&…...
android 扫描二维码
1.在你的build.gradle文件中添加Mobile Vision库的依赖: dependencies {implementation com.google.android.gms:play-services-vision:20.1.0 } 2.创建一个新的Activity来处理扫描过程。 import android.Manifest; import android.content.pm.PackageManager; i…...
[flink 实时流基础] 输出算子(Sink)
学习笔记 Flink作为数据处理框架,最终还是要把计算处理的结果写入外部存储,为外部应用提供支持。 文章目录 **连接到外部系统****输出到文件**输出到 Kafka输出到 mysql自定义 sink 连接到外部系统 Flink的DataStream API专门提供了向外部写入数据的方…...
case语句
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 CASE 语句的执行方式与 IF...THEN...ELSIF 语句的执行方式类似,但是它是通过一个表达式的值来决定执行哪个分支 CASE 选择器表达式 WHEN 条件 1 THEN 语句序列 …...
全国加油站分布数据/停车场分布/公园分布/景区分布/保护区分布/poi感兴趣点
加油站是指为汽车和其它机动车辆服务的、零售汽油和机油的补充站,一般为添加燃料油、润滑油等。由于加油站所销售的石油商品具有易燃爆、易挥发、易渗漏、易集聚静电荷的特性,故加油站以“安全”为第一准则。在加油站内严禁烟火,严禁从事可能…...
单片机简介(一)
51单片机 一台能够运行的计算机需要CPU做运算和控制,RAM做数据存储,ROM做程序存储,还有输入/输出设备(串行口、并行输出口等),这些被分为若干块芯片,安装在主板(印刷线路板…...
Naiveui将message挂载到axios拦截器
最近在做项目,需要将后端的请求结果打印出来 但是想着,要是这样一个一个手动引入naiveui的msg,那不得累死 于是灵机一动,想着既然所有接口要通过拦截器,为什么不将msg写在拦截器呢 一、定义一个消息挂载文件 // The…...
MySQL、Oracle查看字节和字符长度个数的函数
目录 0. 总结1. MySQL1.1. 造数据1.2. 查看字符/字节个数 2. Oracle2.1. 造数据2.2. 查看字符/字节个数 0. 总结 databasecharbyteMySQLchar_length()length()Oraclelength()lengthB() 1. MySQL 1.1. 造数据 sql drop table if exists demo; create table demo (id …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
