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…

WebLogic安装Linux centos7

一、安装前准备工作&#xff1a; 1、创建用户useradd weblogic;创建用户成功linux系统会自动创建一个和用户名相同的分组&#xff0c;并将该用户分到改组中。并会在/home路径下创建一个和用户名相同的路径&#xff0c;比如我们创建的weblogic。 注&#xff1a;当然&#xff0…

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

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

java spring cloud 版 b2b2c 社交电商-服务消费者(Feign)

社交电商平台源码请加企鹅求求&#xff1a;一零三八七七四六二六。Feign是一个声明式的伪Http客户端&#xff0c;它使得写Http客户端变得更简单。使用Feign&#xff0c;只需要创建一个接口并注解。它具有可插拔的注解特性&#xff0c;可使用Feign 注解和JAX-RS注解。Feign支持可…

Mybaits自定义SQL

最近有个同事要包装一个可以执行sql语句的功能用的是mybatis 最开始他想到的方案是拿到数据库连接再执行sql语句。 后来出了某些错误来问我&#xff0c;为了寻求比较快的解决方法于是我就试试了下下面的方法。 首先在Mapper添加 <select id"select" resultMap&qu…

Beta 冲刺 (7/7)

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

类的转换函数调用的优先级与是否用const修饰的关系

P415 C Primer Plus (第六版&#xff09;(待解决~~知道原理的同学请留言&#xff0c;多谢~~&#xff09; #include <iostream>using namespace std; class Cp{private:   int a;   double b;public:   Cp()   {     a 1;     b 2.2;   } operator in…

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;于…

【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)

题目链接 马拉车简单膜你 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN 11000010; const int MOD 19930726; char b[MAXN], a[MAXN << 1]; int hw[MAXN << 1], ans 1, n, c[MAXN]; #defi…

Judy Beta 第三天

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

oracle表空间不足

oracle表空间不足&#xff0c;一般有两个原因&#xff1a;一&#xff0c;原表空间太小&#xff0c;没有自增长&#xff1b;二&#xff0c;表空间已自增长&#xff0c;而且表空间也已足够大&#xff0c;对于这两种原因分别有各自的解决办法。 【检查原因】 1、查看表在那个表空…

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保存时提…

Arcgis 使用ArcToolbox实现数据统计

在ArcMap中打开ArcToolbox&#xff0c; ->Data Managerment Tools ->General ->Add你需要统计的所有数据转载于:https://www.cnblogs.com/CoffeeEddy/p/10161863.html

oracle分区索引及循环插入

表可以按range、hash、list分区&#xff0c;表分区后&#xff0c;其上的索引和普通表上的索引有所不同&#xff0c;oracle对于分区表上的索引分为2类&#xff0c;即局部索引和全局索引&#xff0c;下面分别对这2种索引的特点和局限性做个总结。 局部索引local index 1.局部索引…

classloader.getresources() 介绍

转载自&#xff1a; https://www.cnblogs.com/bhlsheji/p/4095699.html ◆普通情况下,我们都使用相对路径来获取资源,这种灵活性比較大. 比方当前类为com/bbebfe/Test.class 而图像资源比方sample.gif应该放置在com/bbebfe/sample.gif 而假设这些图像资源放置在icons文件夹下,则…

Anti-Aliasing SSAA MSAA MLAA SRAA 简介

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

MyBatis多数据源配置(读写分离)

MyBatis多数据源配置(读写分离) 首先说明&#xff0c;本文的配置使用的最直接的方式&#xff0c;实际用起来可能会很麻烦。 实际应用中可能存在多种结合的情况&#xff0c;你可以理解本文的含义&#xff0c;不要死板的使用。 多数据源的可能情况 1.主从 通常是MySQL一主多…