C++11使用线程类thread的方法

news2024/11/28 9:43:57

C++11 之前,C++ 语言没有对并发编程提供语言级别的支持。如果需要使用线程,windows系统需要使用CreateThread函数创建线程,而linux需要使用pthread库使用线程。C++11 中增加了线程以及线程相关的类,很方便地支持了并发编程。由于可以跨平台使用,大大增加了多线程程序的可移植性。

c++11添加的线程类std::thread

Member types
id	Thread id (public member type)
native_handle_type	Native handle type (public member type)

Member functions
(constructor)	Construct thread (public member function)
(destructor)	Thread destructor (public member function)
operator=	Move-assign thread (public member function)
get_id	Get thread id (public member function)
joinable	Check if joinable (public member function)
join	Join thread (public member function)
detach	Detach thread (public member function)
swap	Swap threads (public member function)
native_handle	Get native handle (public member function)
hardware_concurrency [static]	Detect hardware concurrency (public static member function)

Non-member overloads
swap (thread)	Swap threads (function)

函数说明
thread ()
向构造函数中传入线程函数名和参数,构造一个线程对象,该对象表示新的可连接执行线程。

void foo(int,int,int,int);//线程函数
std::thread first (foo,1,2,3,4);//创建线程对象,调用函数foo,参数为1,2,3,4

get_id()
获取线程id

thread t(func);
cout << "线程t 的线程ID: " << t.get_id() << endl;
cout << "主线程的线程ID: " << this_thread::get_id() << endl;

join()
调用这个函数的线程被阻塞,直到线程对象构造时调用的函数返回。调用此函数后,当子线程执行完毕之后 join() 会清理当前子线程中的相关资源然后返回,线程对象变得非连接状态,并且可以安全销毁。
joinable()
判断主线程和子线程是否是连接状态,主线程和子线程之间有连接关系返回true,主线程和子线程之间没有连接关系返回值false
detach()
线程分离。子线程和主线程分离之后,在主线程中就不能再对这个子线程做任何控制了,比如:无法通过 join () 阻塞主线程等待子线程中的任务执行完毕,不能调用 get_id () 获取子线程的线程 ID。此时调用joinable()函数会返回false。
子线程detach后,相当于放飞自我,子线程的死活就与主线程没有关系了,不再由主线程释放资源,而是由操作系统负责释放该线程资源。
如果子线程分离后,主线程退出,子线程会不会继续存在?
我编辑以下代码进行测试

#include <iostream>	// std::cout
#include <thread>	// std::thread
#include <windows.h>	// Sleep
void foo() 
{
  	while(1){
		Sleep(300);
		std::cout<<"foo\n";
	}
}

int main() 
{
  std::thread first (foo);

  first.detach();
  Sleep(1000);
  std::cout << "main thread exit\n";

  return 0;
}

可以看到,主线程退出后,子线程随之退出,并没有循环一直运行下去
在这里插入图片描述
可见线程分离后,并不是完全与主线程没有关系,只是其资源由操作系统回收,而主线程退出后,该线程也会退出。
线程中的数据
C++多线程程序中,每一个线程都有一个线程栈,它们相互独立,因此在线程栈中的数据,是不会被其他线程影响到。但是在内存中的数据段的数据,比如静态变量,全局变量等,是可以在全局被访问到的。
测试线程代码

// thread example
#include <iostream>       // std::cout
#include <thread>         // std::thread
void foo() 
{
  // do stuff...
	std::cout<<"foo\n";;
	std::cout<<"foo\n";;
}

void bar(int x)
{
  // do stuff...
	std::cout<<"bar argument:"<<x<<std::endl;
	std::cout<<"bar argument:"<<x<<std::endl;
}
int main() 
{
  std::thread first (foo);     // spawn new thread that calls foo()
  std::thread second (bar,1);  // spawn new thread that calls bar(0)
  std::thread third (bar,0);

  std::cout << "main, foo and bar now execute concurrently...\n";

  // synchronize threads:
  first.join();                // pauses until first finishes
  second.join();               // pauses until second finishes
  third.join();
  std::cout << "foo and bar completed.\n";

  return 0;
}

编译链接,由于需要c++11特性的支持,gcc需要加参数-std=c++11 or -std=gnu++11

g++ TestThread.cpp -std=c++11

在这里插入图片描述
由于线程竞争的问题,会导致一条语句输出的不完整。并且我发现,这种竞争只会发生在同名函数之间,线程函数foo()的输出不会被函数bar()打断,而函数bar()的输出会被其它的线程函数bar()打断

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

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

相关文章

活动星投票十大商业品牌网络评选微信的投票方式线上免费投票

“十大商业品牌”网络评选投票_线上系统免费投票_功能齐全的视频投票_在线投票免费小程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投…

CV学习笔记-VGG

VGG 1. 常见的卷积神经网络 VGG属于一种经典的卷积神经网络结构&#xff0c;其出现在AlexNet之后&#xff0c;由于AlexNet的突破证实了卷积神经网络的可行性&#xff0c;VGG的思路主要是将网络层数加深&#xff0c;从某种意义上说&#xff0c;网络层数的加深可以粗略地认为考虑…

编译原理学习笔记14——属性文法与语法制导翻译1

编译原理学习笔记14——属性文法与语法制导翻译114.1 属性文法14.2 属性计算14.1 属性文法 属性文法 综合属性 自下而上传递信息语法规则&#xff1a;根据右 部候选式中的符号 的属性计算左部被 定义符号的综合属性语法树&#xff1a;根据子结 点的属性和父结点 自身的属性…

【日常系列】LeetCode《30·动态规划总结》

动态规划总结 线性动态规划问题总结 打家劫舍总结 最大子数组和总结 dp[i] 依赖于前面一个或者两个状态 dp[i] 依赖于前面多个状态 注意&#xff1a;子序列可以不连续 dp[i] 带有一个或者多个维度 输入为两个数组或者两个字符串 lc 10【剑指 19】【top100】&#xff1a;正…

【LeetCode每日一题:2309. 兼具大小写的最好英文字母~~~模拟+Hash表+贪心】

题目描述 给你一个由英文字母组成的字符串 s &#xff0c;请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母&#xff0c;则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 …

Java生成微信小程序二维码,5种实现方式,一个比一个简单

文章目录前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数mapbyte[]数组源码下载前言 先介绍一下项目场景&#xff0c;主要是通过微信小程序二维码裂变分享&#xff…

一时重构一时爽,一直重构一直爽

笔者&#xff08;后台技术汇&#xff09;恭祝各位大佬&#xff1a;2023年春节快乐&#xff0c;兔年祥瑞。距离上次更新&#xff0c;已经过去5个月有余了&#xff0c;有小伙伴疑惑笔者是不是删库跑路了..其实不是&#xff0c;这段时间是在参加一次比较大的项目重构&#xff08;目…

学习笔记 —— python代码耗时及内存占用测试方法

1、手写耗时测试 先看结果; 主要有三种方法&#xff0c;各自的时钟间隔如下&#xff1a; time.time() timeit time.time_ns() ( time is outputted in ns!). 可见方法2&#xff0c;即timeit 的时钟间隔最短。 注&#xff1a;最后一个是以ns为单位的&#xff0c;前两个是…

二叉树的概念与结构

文章目录前言一、树的概念及结构1.树的概念2.树的相关概念3.树的表示4. 树在实际中的运用二、二叉树概念及结构1.概念2.特殊的二叉树5.二叉树的性质6.二叉树的存储结构(1).顺序存储&#xff08;2&#xff09;.链式存储结语前言 因为二叉树的知识点太多&#xff0c;一篇文章讲不…

《真象还原》读书笔记——第一章 部署工作环境

环境&#xff1a; 由于平时使用 windows 系统 所以 linux 环境 使用了 linux子系统。 $ cat /proc/version Linux version 4.4.0-22000-Microsoft (MicrosoftMicrosoft.com) (gcc version 5.4.0 (GCC) )1.1 工欲善其事 必先利其器 操作环境很重要呀。 1.2 编译器 GCC: gc…

Java 23种设计模式(8.结构型模式-桥接模式)

结构型模式-桥接模式 代码分析 类图 代码 public interface Implementor {void operation(); }public class ConcreteImplementorA implements Implementor{Overridepublic void operation() {System.out.println("A");} }public class ConcreteImplementorB imple…

(Java高级教程)第四章必备前端基础知识-第二节3:CSS盒模型和浮动

文章目录一&#xff1a;盒模型&#xff08;1&#xff09;border&#xff08;2&#xff09;padding&#xff08;3&#xff09;margin二&#xff1a;flex布局一&#xff1a;盒模型 盒模型&#xff1a;在HTML中&#xff0c;每个标签&#xff08;或元素&#xff09;相当于是一个盒…

DaVinci:色彩匹配

z调色页面&#xff1a;色彩匹配Color&#xff1a;Color Match色彩匹配 Color Match调板是专业的一级调色工具&#xff0c;专门用于对视频图像进行精准的校色还原。色彩匹配时&#xff0c;先定位到视频中持有色卡的画面。在检视器左下角快捷菜单中选择“色卡” Color Chart工具&…

C 语言零基础入门教程(十二)

C enum(枚举) 枚举是 C 语言中的一种基本数据类型&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举语法定义格式为&#xff1a; enum 枚举名 {枚举元素1,枚举元素2,……};接下来我们举个例子&#xff0c;比如&#xff1a;一星期有 7 天&#xff0c;如果不用枚举&…

【Linux】vim编辑器的使用

文章目录vim的基本概念vim指令集复制粘贴撤销、剪切光标定位vim的基本概念 vim是一款多模式的编辑器&#xff0c;在我们常用的模式有3~5种。分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08; last lin…

【PHP 随记】—— ThinkPHP 配置数据库

&#x1f449;总目录&#x1f448;\large\colorbox{skyblue}{&#x1f449;总目录&#x1f448;}&#x1f449;总目录&#x1f448;​ 文章目录1、数据库连接及导入① 数据库连接② 数据库导入2、配置 ThinkPHP 数据库连接信息① 配置连接信息1、数据库连接及导入 ① 数据库连…

大数据分析案例-基于随机森林算法构建人口普查分析模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Datawhale 202301 设计模式 | 人工智能 现代方法 习题

Exercise 1 绪论 Q&#xff1a;用您自己的话来定义&#xff1a;&#xff08;a&#xff09;智能&#xff0c;&#xff08;b&#xff09;人工智能&#xff0c;&#xff08;c&#xff09;智能体&#xff0c;&#xff08;d&#xff09;理性&#xff0c;&#xff08;e&#xff09;逻…

【大数据趋势】1月24日 流动、固定汇率和货币政策独立性三者的三者选二,A股持续的会上涨。

前言&#xff1a;昨天写的被朋友看到&#xff0c;认为我写的太水&#xff0c;故意不提日常讨论的那个关键指标&#xff0c;所以下午重新修改了一下。 确定欧美大势市场形态1 - 美元指数 关键位置大概率不会一次就破&#xff0c;有较强反弹可能&#xff0c;带动美股反弹 作为长…

MH-100X微波运动传感器介绍

MH-100X微波运动传感器简介微波运动传感器是利用多普勒雷达原理设计的微波移动物体探测器。不同于一般的红外探测器&#xff0c;微波传感器通过通过检测物体反射的微波来探测物体的运动状况&#xff0c;检测对象将并不会局限于人体&#xff0c;还有很多其他的事物。微波传感器不…