C++11并发编程:多线程std::thread

一:概述

C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。

所需头文件<thread>

二:构造函数

1.默认构造函数

thread() noexcept
一个空的std::thread执行对象

2.初始化构造函数

template<class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
创建std::thread执行对象,线程调用threadFun函数,函数参数为args。

1 void threadFun(int a)
2 {
3     cout << "this is thread fun !" << endl;
4 }
5 
6 thread t1(threadFun, 2);

3.拷贝构造函数

thread(const thread&) = delete;
拷贝构造函数被禁用,std::thread对象不可拷贝构造

1 void threadFun(int& a)
2 {
3     cout << "this is thread fun !" << endl;
4 }
5     
6 int value = 2;
7 thread t1(threadFun, std::ref(value));

4.Move构造函数

thread(thread&& x)noexcept
调用成功原来x不再是std::thread对象

1 void threadFun(int& a)
2 {
3     cout << "this is thread fun !" << endl;
4 }
5 
6 int value = 2;
7 thread t1(threadFun, std::ref(value));
8 thread t2(std::move(t1));
9 t2.join();

三:成员函数

1.get_id()

获取线程ID,返回类型std::thread::id对象。

 1 thread t1(threadFun);
 2 thread::id threadId = t1.get_id();
 3 cout << "线程ID:" << threadId << endl;
 4 
 5 //threadId转换成整形值,所需头文件<sstream>
 6 ostringstream   oss;
 7 oss << t1.get_id();
 8 string strId = oss.str();
 9 unsigned long long tid = stoull(strId);
10 cout << "线程ID:" << tid << endl;

2.join()

创建线程执行线程函数,调用该函数会阻塞当前线程,直到线程执行完join才返回。

thread t1(threadFun);
t1.join()  //阻塞等待

3.detach()

detach调用之后,目标线程就成为了守护线程,驻留后台运行,与之关联的std::thread对象失去对目标线程的关联,无法再通过std::thread对象取得该线程的控制权。

4.swap()

交换两个线程对象

1 thread t1(threadFun1);
2 thread t2(threadFun2);
3 cout << "线程1的ID:" << t1.get_id() << endl;
4 cout << "线程2的ID:" << t2.get_id() << endl;
5 
6 t1.swap(t2);
7 
8 cout << "线程1的ID:" << t1.get_id() << endl;
9 cout << "线程2的ID:" << t2.get_id() << endl;

5.hardware_concurrency()

获得逻辑处理器储量,返回值为int型

 1 int coreNum = thread::hardware_concurrency(); 

四:使用

 1.创建线程

 1 void threadFun1()
 2 {
 3     cout << "this is thread fun1 !" << endl;
 4 }
 5 
 6 int main()
 7 {
 8     thread t1(threadFun1);
 9     t1.join();
10 
11     getchar();
12     return 1;
13 }

2.创建线程,传参

 1 void threadFun1(int v)
 2 {
 3     cout << "this is thread fun1 !" << endl;
 4     cout << v << endl;
 5 }
 6 
 7 int main()
 8 {
 9     int value = 6;
10     thread t1(threadFun1, value);
11     t1.join();
12 
13     getchar();
14     return 1;
15 }

需要注意,变量int value 和int v 做变量传递时并不是引用,而是对变量做了拷贝,所以在传递给int v前,int value不能出作用域(释放了内存),join(),可以保证int value变量释放内存,如果使用detach(),可能存在这种情况。

3.创建线程,引用传参

 1 void threadFun1(int& v)
 2 {
 3     cout << "this is thread fun1 !" << endl;
 4     cout << v << endl;
 5 }
 6 
 7 int main()
 8 {
 9     int value = 6;
10     thread t1(threadFun1, std::ref(value));
11     t1.join();
12 
13     getchar();
14     return 1;
15 }

4.创建建线程,线程函数为类成员函数

 1 class Object
 2 {
 3 public:
 4     Object()
 5     {
 6         cout << "构造函数" << endl;
 7     }
 8 
 9     ~Object()
10     {
11         cout << "析构函数" << endl;
12     }
13 
14     void fun(string info)
15     {
16         cout << info << endl;
17     }
18 
19 };
20 
21 int main()
22 {
23 
24     Object obj;
25     string str = "我是一个类的成员函数!";
26     thread t1(&Object::fun, &obj, str);
27     t1.join();
28 
29     getchar();
30     return 1;
31 }

 

扫码关注公众号

专注分享C/C++,C++(11,14,17),STL,Java,Spring,mybatis,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,还有高薪互联网职位内推,在这里一起探讨,一起学习,一起进步,同时不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣!

转载于:https://www.cnblogs.com/woniu201/p/10145044.html

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

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

相关文章

图像特征提取——韦伯局部描述符(WLD)

一、原理及概述 韦伯局部描述符&#xff08;WLD&#xff09;是一种鲁棒性好、简单高效的局部特征描述符。WLD由两个部分组成&#xff1a;差分激励和梯度方向。 其具体算法是对于给定的一幅图像&#xff0c;通过对每个像素进行这两个分量的计算来提取其差分激励图像和梯度方向图…

Linux下Nagios的安装与配置

Linux下Nagios的安装与配置 一、Nagios简介 Nagios是一款开源的电脑系统和网络监视工具&#xff0c;能有效监控Windows、Linux和Unix的主机状态&#xff0c;交换机路由器等网络设置&#xff0c;打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员&am…

POJ_3262 Protecting the Flowers 【贪心】

一、题面 POJ3262 二、分析 这题要往贪心上面想应该还是很容易的&#xff0c;但问题是要证明为什么比值关系就能满足。 可以选择几个去分析&#xff0c;入1-6 与 2-15 和 1-6 与2-5 和 1-6 与 2- 12。 三、AC代码 1 #include <cstdio>2 #include <iostream>3 #in…

jquery如何阻止子元素继承父元素的事件(又称事件冒泡)

非常简单&#xff0c;子元素上添加如下代码即可 1 $(a).click(function(e){ 2 e.stopPropagation(); 3 }); 老版本为event,现在用e就行 转载于:https://www.cnblogs.com/chengbo2130/p/10152747.html

Beta 冲刺 (7/7)

团队信息 队名&#xff1a;爸爸饿了组长博客&#xff1a;here作业博客&#xff1a;here组员情况 组员1&#xff08;组长&#xff09;&#xff1a;王彬 过去两天完成了哪些任务 协助完成安卓端的整合完成安卓端的美化协助制作宣传视频 接下来的计划 & 还剩下哪些任务 I am d…

Java Web 学习与总结(一)Servlet基础

配置环境&#xff1a;https://www.cnblogs.com/qq965921539/p/9821374.html 简介&#xff1a; Servlet是Sun公司提供的一种实现动态网页的解决方案&#xff0c;在制定J2EE时引入它作为实现了基于Java语言的动态技术&#xff0c;目前流行的Web框架基本都基于Servlet技术&#xf…

堪称经典

程序员作为高智商、高收入、高压力群体&#xff0c;经常会有各种自嘲&#xff0c;而且还天生携带段子手基因。不信看看下面这些段子&#xff0c;一般人哪能懂&#xff01; 1、杀一个程序员不需要用枪&#xff0c;改三次需求就可以了 2、程序员退休后决定练习书法&#xff0c;于…

Judy Beta 第三天

概述 前端部分对于打包的流程以及相关 package.json 的配置都已经比较熟悉了&#xff0c;目前主要负责对新实现的 feature 做测试&#xff0c;以及参考 DAP 为后端明确数据交换的格式及参数内容等。 后端部分按照更新的 wiki 实现了变量展开&#xff0c;并且根据 DAP 的协议流程…

python学习中遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> def contract_str():index 8db_size 8new_table_name b_str(index & (db_size-1))print new_table_name ImportError: No module named mysql.connector import mysql.connector as sql_connector Python保存时提…

Anti-Aliasing SSAA MSAA MLAA SRAA 简介

http://blog.csdn.net/codeboycjy/article/details/6312758 前两天在浏览游民星空的时候&#xff0c;小编居然在文章中挂了一篇技术文章&#xff0c;是关于SRAA的。对于AA的了解很少&#xff0c;正好入职之前还有几天的空闲时间&#xff0c;所以就这个机会把AA的一些基本算法简…

Qt的安装和使用中的常见问题(详细版)

对于太长不看的朋友&#xff0c;可参考Qt的安装和使用中的常见问题&#xff08;简略版&#xff09;。 目录 1、引入2、Qt简介3、Qt版本 3.1 查看安装的Qt版本3.2 查看当前项目使用的Qt版本3.3 查看当前项目使用的QtCreator版本3.4 Linux命令行下查看和使用不同版本的Qt4、Qt模块…

各行业大数据可视化界面参考

转载于:https://www.cnblogs.com/wangsongbai/p/10178096.html

今日听闻这几款手机软件比较火爆 果然名不虚传!

如今的时代&#xff0c;智能手机已经成为我们生活中不可缺少的一部分&#xff0c;大家之所以这么爱玩手机&#xff0c;其实并不是手机本身有多么吸引人&#xff0c;而是安装在手机上的各种各样的APP&#xff0c;比如各种社交软件、音频软件、购物软件以及地图软件等等。下面我们…

postman提取返回值

Postman是做接口测试的&#xff0c;但是很多接口并不是直接就能测&#xff0c;有的需要一些预处理。比如说身份认证&#xff0c;需要传递一个token。如果做网页测试&#xff0c;一般打开登陆界面的时候就会生成一个token&#xff0c;如果返回值是json格式&#xff0c;用Postman…

大数据学习要知道的十大发展趋势,以及学习大数据的几点建议

2016年&#xff0c;近40%的公司正在实施和扩展大数据技术应用&#xff0c;另有30%的公司计划在未来12个月内采用大数据技术&#xff0c;62.5%的公司现在至少有一个大数据项目投入生产&#xff0c;只有5.4%的公司没有大数据应用计划&#xff0c;或者是没有正在进行的大数据项目&…

Hiv:SQuirrel连接hive配置

熟悉了Sqlserver的sqlserver management studio、Oracle的PL/SQL可视化数据库查询分析工具&#xff0c;在刚开始使用hive、phoenix等类sql组件时&#xff0c;一直在苦苦搜寻是否也有类似的工具&#xff0c;不负所望&#xff0c;SQuirrel Sql client 可视化数据库工具基本可满足…

windows下cmd常用的命令

2019独角兽企业重金招聘Python工程师标准>>> windows下常用的命令指示行: windows下 CMD比较常见的命令1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. …

Hive的内置数据类型

Hive的内置数据类型可以分为两大类&#xff1a;(1)、基础数据类型&#xff1b;(2)、复杂数据类型。其中&#xff0c;基础数据类型包括&#xff1a;TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。下面的表格列出这些基…

ubuntu18.04安装chrome和优化界面

一分钟安装教程chrome教程&#xff01; 1、将下载源加入到系统的源列表&#xff08;添加依赖&#xff09; sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ 2、导入谷歌软件的公钥&#xff0c;用于对下载软件进行验证。 wget -q -O - …

Java学习进阶—高级编程

当你已经熟练的掌握了面向对象中的各种概念后&#xff0c;是否会对这些知识是如何使用的产生浓厚的兴趣&#xff1f;本课程主要针对于已经掌握了JAVA核心开发技术的读者准备&#xff0c;讲解了JAVA多线程、常用类库、IO编程、网络编程、类集框架、JDBC等与Java实际应用有关的开…