Linux下C++11的线程类用法(可连接线程和可分离线程thread)_三公子Tjq的博客-程序员宅基地

技术标签: 可连接线程  C++应用积累  Linux  c++11  多线程  thread  Linux积累  

Linux下调用多线程有两种方式,一种是利用POSIX线程库,一种是用C++11中的线程类,本文用的是后者。其中,Linux下用C++11创建多线程分为可连接的和不可连接的。

可连接线程:需要调用thread成员函数thread::join()阻塞等待线程结束并且回收资源;thread默认创建的线程是可连接线程!

不可连接线程(也就是分离线程):直接调用thread::detach()即可在线程结束后自动回收资源。

函数pthread_exit(NULL)(放在主函数里面)表示主线程结束后,该线程所在进程并不会立即结束,要等所有线程结束后主进程才会结束。

下面将分别列举可连接线程和分离线程实例。

 

实例1  创建一个可连接线程,并传入字符串

步骤1:在Linux目录下新建一个文件名为thread_input_char.cpp空白文件,输入下列代码:

#include <iostream>
#include <thread>
using namespace std;

void thfunc(char *s)
{
	cout<<"child thread char =="<< s << "\n";	//打印传入的字符串
}

int main(int argc, char *argv[])
{
	char s[] = "I am a main thread char";
	thread t(thfunc,s);	//创建线程,传入线程函数,带字符串
	t.join();
	return 0;
}

步骤2:在终端terminal输入下列命令,生成可执行程序thread_input_char,然后运行可执行程序,结果如下图所示:

g++ -o thread_input_char thread_input_char.cpp -lpthread -std=c++11

 

实例2  创建一个分离线程,并且传入结构体和多个变量

步骤1:在Linux目录下新建一个文件名为thread_input_struct.cpp空白文件,输入下列代码:

#include <iostream>
#include <thread>
using namespace std;

typedef struct	//
{
	int num;
	const char *str;	//z
}MYSTRUCT;

void thfunc(void *arg, int m, int *k, char s[])
{
	MYSTRUCT *p = (MYSTRUCT*)arg;	//
	cout<<"child thread p->num =="<< p->num <<"\nchild thread p->str =="<< p->str<<endl;	//d
	cout<<"child thread m =="<<m<<"\nchild thread k =="<<*k<<"\nchild thread str =="<<s<<endl;	//
	*k=7777;
}

int main(int argc, char *argv[])
{
	MYSTRUCT mystruct;	//d
	mystruct.num = 666;
	mystruct.str =  "I am a struct";
	
	int m=300,k=12;
	char str[]="I am a string";	

	thread t(thfunc,&mystruct,m,&k,str);	//s
	t.detach();	//

	cout<<"changed value k =="<<k<<endl;	//7777
	pthread_exit(NULL);	//

	cout<<"I can not run!"<<endl;
	return 0;
}

步骤2:在终端terminal输入下列命令,生成可执行程序thread_input_char,然后运行可执行程序,结果如下图所示:

g++ -o thread_input_struct thread_input_struct.cpp -lpthread -std=c++11

 

 

参考内容:

《Linux C与C++ 一线开发实践》  397-399页

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/naibozhuan3744/article/details/87990691

智能推荐

Bootstrap的起步_weixin_30849591的博客-程序员宅基地

-- Bootstrap的起步部分是对Bootstrap的基本了解,有些细节只是在后面的完善时候需要详细阅读。最基本点还是Css 和组件部分,这部分应该先进行练习....高级阶段是Javascript插件和定制部分;最后是网站实例的学习。** 学习需要持之以恒,不进则退。1. Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 W...

yolov3 qqwweee的使用 train步骤 制作数据集_巴德鸟的博客-程序员宅基地_qqwweee什么意思

文章目录使用快速应用训练自己的数据1.制作数据集2.生成训练集、验证集等依赖的text文件3.将VOC文件转化成YOLOv3需要的训练格式文件4.修改yolov3.cfg5.修改voc_classes.txt5.模型保存的路径6.修改train.py文件理解源码GITHUB地址:https://github.com/qqwweee/keras-yolo3官方权值下载地址:https://p...

打字时全部是繁体字,如何改为简体中文?_UlricaQ的博客-程序员宅基地_打字繁体字转换简体字

问题敲项目时,突然简体中文全部变成了繁体字。起源原来是因为我在敲项目时,按了CTRL+shift+F键。这个是改变中文简繁体的快捷键。具体设置下面说明解决右下角右击中文输入。选择设置选择按键下拉,选择快捷键,如下图。这里可以关闭,也可以设置自己想要的快捷键。以后简繁体切换就方便多了。...

JAVA根据URL网址获取输入流_知彼解己的博客-程序员宅基地_java根据url获取流

/** * 根据地址获得数据的输入流 * @param strUrl 网络连接地址 * @return url的输入流 */ public static InputStream getInputStreamByUrl(String strUrl){ HttpURLConnection conn = null; try { U...

cocoaPods私有库的创建与使用_一粒沙-的博客-程序员宅基地

一 创建私有 pods创建私有 Spec Repo(也就是所有私有 pod 的仓库)spec repo 是pods的一个索引,是所有公开的pods 的podspec文件的一个仓库,其实就是一个部署在服务器的Git仓库,当你使用CocoaPods 后它会被Clone到本地的~/.cocoapods/repos。这个仓库只存放podspec文件步骤1:创建私有仓库1、在git上创建私有...

随便推点

springcloud+zuul+oauth2微服务安全配置详解_雾猩CODER的博客-程序员宅基地

springcloud+zuul+oauth2微服务网关安全配置详解一、构建webserver服务器二、构建zuul网关服务三、测试网关授权服务上一篇:oauth2认证详情配置:https://blog.csdn.net/qq_46564068/article/details/108961557一、构建webserver服务器pom配置:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apac

JAVA学习之继承和方法覆盖_JerryWu2018的博客-程序员宅基地

一、继承1.继承是面向对象的三大特征之一,三大特征分别是:封装、继承、多态2.继承的基本作用:代码复用,但是继承最重要的作用时,有了继承后才有了以后的“方法覆盖”和“多态机制”3.继承语法格式:[修饰符列表] class 类名 extends 父类名{ 类体= 属性 + 方法}4.java语言中的继承只支持单继承,一个类不能继承很多类,仅能继承一个类。C++中支持多继承。5.关于继承的一些术语:B类继承A类,其中:A类称为:父类、基类、超类、superclassB类称为:子类、派生

操作系统学习笔记: IO设备_第六帅的博客-程序员宅基地_programabled io是

参考资料: 《现代操作系统 3th edtion》原书第五章 输入/输出在 xmind 上记录一、硬件原理大致分类块设备CD-ROM/硬盘/USB每个块都能独立于其他块而读写字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构鼠标/打印机其他设备时钟IO设备组成电子部件称作设备控制器(device controller)或...

数据分组处理的java实现_fang.sean的博客-程序员宅基地

大多情况下sql是可以实现数据的处理,可以减少程序去做额外的处理工作,只是有些业务情况sql做不到的,比如说本人在数据处理工作中,会涉及到对数据单独做分组展示的情况;不是sql的group by 返回list,而是返回的数据集为List&lt;Map&gt;等复杂的层级数组,而且具有分组的特点。比如下面的Bean:@[email protected]@AllArgsConstructorpubli...

中国大学MOOC 程序设计与算法(三)STL部分 笔记_陶晨毅的博客-程序员宅基地

有道云笔记分享链接:http://note.youdao.com/noteshare?id=fd5774a94caf583f1a4a37e78ab61f0d&amp;sub=5EA8C6964DFC4C9E9B4262023926A543

推荐文章

热门文章

相关标签