c+++11并发编程语言,C++11并发编程:多线程std:thread

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

一:概述

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

所需头文件

二:构造函数

1.默认构造函数

thread() noexcept

一个空的std::thread执行对象

2.初始化构造函数

template

explicit thread(Fn&& fn, Args&&... args);

创建std::thread执行对象,线程调用threadFun函数,函数参数为args。

void threadFun(int a)

{

cout << "this is thread fun !" << endl;

}

thread t1(threadFun, 2);

3.拷贝构造函数

thread(const thread&) = delete;

拷贝构造函数被禁用,std::thread对象不可拷贝构造

void threadFun(int& a)

{

cout << "this is thread fun !" << endl;

}

int value = 2;

thread t1(threadFun, std::ref(value));

4.Move构造函数

thread(thread&& x)noexcept

调用成功原来x不再是std::thread对象

void threadFun(int& a)

{

cout << "this is thread fun !" << endl;

}

int value = 2;

thread t1(threadFun, std::ref(value));

thread t2(std::move(t1));

t2.join();

三:成员函数

1.get_id()

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

thread t1(threadFun);

thread::id threadId = t1.get_id();

cout << "线程ID:" << threadId << endl;

//threadId转换成整形值,所需头文件

ostringstream oss;

oss << t1.get_id();

string strId = oss.str();

unsigned long long tid = stoull(strId);

cout << "线程ID:" << tid << endl;

2.join()

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

thread t1(threadFun);

t1.join() //阻塞等待

3.detach()

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

4.swap()

交换两个线程对象

thread t1(threadFun1);

thread t2(threadFun2);

cout << "线程1的ID:" << t1.get_id() << endl;

cout << "线程2的ID:" << t2.get_id() << endl;

t1.swap(t2);

cout << "线程1的ID:" << t1.get_id() << endl;

cout << "线程2的ID:" << t2.get_id() << endl;

5.hardware_concurrency()

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

int coreNum = thread::hardware_concurrency();

四:使用

1.创建线程

void threadFun1()

{

cout << "this is thread fun1 !" << endl;

}

int main()

{

thread t1(threadFun1);

t1.join();

getchar();

return 1;

}

2.创建线程,传参

void threadFun1(int v)

{

cout << "this is thread fun1 !" << endl;

cout << v << endl;

}

int main()

{

int value = 6;

thread t1(threadFun1, value);

t1.join();

getchar();

return 1;

}

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

3.创建线程,引用传参

void threadFun1(int& v)

{

cout << "this is thread fun1 !" << endl;

cout << v << endl;

}

int main()

{

int value = 6;

thread t1(threadFun1, std::ref(value));

t1.join();

getchar();

return 1;

}

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

class Object

{

public:

Object()

{

cout << "构造函数" << endl;

}

~Object()

{

cout << "析构函数" << endl;

}

void fun(string info)

{

cout << info << endl;

}

};

int main()

{

Object obj;

string str = "我是一个类的成员函数!";

thread t1(&Object::fun, &obj, str);

t1.join();

getchar();

return 1;

---------------------

作者:蜗牛201

原文:https://blog.csdn.net/woniu211111/article/details/85123281

责任编辑:

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

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

相关文章

交换机虚拟化和堆叠的区别_核心交换机和普通交换机有何区别?

提起核心交换机与普通交换机有什么区别&#xff1f;相信很多朋友都有点迷惑&#xff0c;今天我们一起来了解下。核心交换机并不是交换机的一种类型&#xff0c;而是放在核心层(网络主干部分)的交换机叫核心交换机。一般大型企业网络和网吧需要购买核心交换机来实现强大的网络扩…

tmpfiles.d导致的unix:///tmp/supervisor.sock no such file坑(待续)

为什么80%的码农都做不了架构师&#xff1f;>>> 系统环境: CentOS Linux release 7.1.1503 (Core) supervisor 3.3.1今天初七&#xff0c;刚放完假需要去supervisor restart下程序。发现报了这个错误。但是看supervisord的进程还在运行&#xff0c;项目代码也还在…

springMVC两种方式实现多文件上传及效率比较

springMVC实现多文件上传的方式有两种&#xff0c;一种是我们经常使用的以字节流的方式进行文件上传&#xff0c;另外一种是使用springMVC包装好的解析器进行上传。这两种方式对于实现多文件上传效率上却有着很大的差距&#xff0c;下面我们通过实例来看一下这两种方式的实现方…

c语言 个位,如何才能给C语言增加几个位操作函数

在汇编语言中有直接对位进行操作的指令&#xff0c;如置位、复位、位取反、测试某一位等&#xff0c;这对于硬件操作十分方便&#xff0c;在C语言中尽管也提供了一些位操作手段&#xff0c;如按位与、按位或、按位取反等&#xff0c;但它们是对一个字节进行操作&#xff0c;如要…

hsrp 切换_HSRP、VRRP、GLBP | 网络工程师之网关高可用、冗余

在RS的学习过程中我们接触到很多网络技术&#xff0c;后面就把工作中常用的拿来与大家分享&#xff0c;本次我们来分享网关冗余技术。当我们的网关设备无法使用堆叠(VSS,istack&#xff0c;IRF)&#xff0c;或者不同厂商设备的时候&#xff0c;非常有效&#xff0c;能够提供网关…

Linux文件系统详解

从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考&#xff1a; http://blog.chinaunix.net/uid-8698570-id-1763151.htmlhttp://www.iteye.com/topic/816268http://soft.chinabyte.co…

opencv机器学习线性回归_机器学习(线性回归(二))

Lasso与岭回归的同和异Lasso、岭回归都可以预防模型过拟合Lasso回归惩罚项为L1正则&#xff0c;岭回归为L2正则Lasso回归可用来特征选择&#xff0c;岭回归则不能Lasso回归用坐标下降法求解&#xff0c;岭回归用梯度下降法求解。为什么Lasso可用于特征选择&#xff0c;而岭回归…

c语言int a什么意思,问一下吧里大神 int a = a; 这么定义是什么意思?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼使用自身初始化&#xff0c;具有indeterminate value&#xff0c;可能是trap representation导致使用这个对象的值引起undefined behavior。但这个初始化语法上是正确的&#xff0c;也没有语义错误。ISO C113.19.21 indeterminate …

把EXCEL用程序导入到ORACLE中(SpringMVC+MyBatis)

前提&#xff1a;项目中需要把EXCEL数据批量导入oracle中两张表中。如是用到了poi技术。分别导入poi-3.11-beta2.jar和poi-ooxml-schemas-3.9.jar这两个包。EXCEL数据如下 第一步&#xff1a;修改spring框架配置文件。 springmvc-servlet.xml加上&#xff1a; <!-- 文件上传…

access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量

西门子PLC1200&#xff0c;组态王跟Access数据库--⑥组态王变量组态王的变量设置1.0 变量设置如下图所示&#xff0c;选择数据词典&#xff0c;里面是系统变量跟新建的变量&#xff0c;选择新建1.1 如下图&#xff0c;从上往下依次&#xff0c;变量名(这个应该知道)&#xff0c…

Android 撸起袖子,自己封装 DialogFragment

前言 具体的代码以及示例我都放上 Github 了&#xff0c;有需要的朋友可以去看一下 DialogFragmentDemos&#xff0c;欢迎 star 和 fork. 本文的主要内容 DialogFragment 是什么创建通用的 CommonDialogFragment实现各种类型的 DialogFragment在写正文之前&#xff0c;先来一波…

as模拟器文件夹路径_EGG Switch手机模拟器怎么用?中文教程来了......

大家好&#xff0c;小鸡妹我又来啦。自从昨天曝光了美国NX工作室的EGG模拟器之后&#xff0c;推文底下就多了一千多条留言&#xff0c;说啥的都有。不过小鸡妹大概总结了一下&#xff0c;发现下面这几条问题&#xff0c;出现的频率最高&#xff1a;① 找不到网址&#xff1b;②…

xml文件c语言读取函数,读写xml文件的2个小函数

#region 读写xml文件的2个小函数&#xff0c;2005 4 2 by hycpublic void SetXmlFileValue(string xmlPath,string AppKey,string AppValue)//写xmlPath是文件路径文件名&#xff0c;AppKey是 Key Name&#xff0c;AppValue是Value{XmlDocument xDoc new XmlDocument();xDoc.L…

Java导入导出Excel工具类ExcelUtil

前段时间做的分布式集成平台项目中&#xff0c;许多模块都用到了导入导出Excel的功能&#xff0c;于是决定封装一个ExcelUtil类&#xff0c;专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA&#xff08;底层用hibernate实现&#xff09;&#xff0c;所以导入和导出也…

郁金香汇编代码注入怎么写看雪_世界黑客编程大赛冠军的汇编代码 你见过吗?...

前几天发布了一篇“雷军22年前写的汇编代码”的文章&#xff0c;引起网友的热议。有人说汇编是最牛逼的编程语言&#xff0c;没有之一。汇编语言确实厉害&#xff0c;不知道你有没有见过世界黑客编程大赛冠军的作品?雷军编写的的汇编代码有 网友分享了97年Mekka ’97 4K Intro…

变位齿轮重合度计算公式_齿轮“模数”是如何计算的?

模数是决定齿轮大小的因素。齿轮模数被定义为模数制轮齿的一个基本参数&#xff0c;是人为抽象出来用以度量轮齿规模的数。目的是标准化齿轮刀具&#xff0c;减少成本。直齿、斜齿和圆锥齿齿轮的模数皆可参考标准模数系列表。工业定义&#xff1a;齿轮的分度圆是设计、计算齿轮…

c语言改错和填空能运行吗,C语言改错填空编程

改错题1、在考生文件夹下&#xff0c;给定程序MODI.C的功能是&#xff1a;从低位开始取出长整型变量s中奇数位上的数&#xff0c;依次构成一个新数放在t中。例如&#xff0c;当s中的数为&#xff1a;7654321时&#xff0c;t中的数为&#xff1a;7531。请修改并运行该程序&#…

@Autowired注解实现原理

在讨论代码细节之前&#xff0c;我们再来了解下基础知识。Spring管理可用于整个应用程序的Java对象bean。他们所在的Spring容器&#xff0c;被称为应用程序上下文。这意味着我们不需要处理他们的生命周期(初始化&#xff0c;销毁)。该任务由此容器来完成。另外&#xff0c;该上…

获取freemarker处理后的内容

相信很多人都用过freemarker&#xff0c;或做视图&#xff0c;或模板&#xff0c;或生成静态文件等,但是有多少人做过这样的应用&#xff0c;通过模板后&#xff0c;不是要输出静态的内容&#xff0c;而是直接在代码中获取处理模板后的内容&#xff0c;研究了下API,freemarker里…

c4.5算法python实现_算法:用Python实现—最优化算法

今天给大家分享一下算法&#xff0c;用python来实现最优化算法。废话不多说&#xff0c;直接上代码&#xff1a;一、二分法函数详见rres&#xff0c;此代码使该算法运行了两次def asdf(x): rres8*x**3-2*x**2-7*x3 return rresi2left0right1while i>0 : i i-1 …