C++之多线程编程_c++多线程编程-程序员宅基地

技术标签: c++  开发语言  

一、并发的实现

        1.多进程并发主要解决进程间通信的问题

                ①同一电脑上:管道、文件、消息队列、内存共享。

                ②不同电脑上:socket网络通信。

        2. 单进程中的多个线程并发(一个主线程+多个子线程实现并发)

                ①一个进程中的所有线程共享内存空间 eg:全局变量,指针引用

二、线程的多种创建方式

 1. 调用thread类去创建线程对象

        头文件和子线程处理函数(以下所有代码段共用):

#include<iostream>
#include<thread>
#include<windows.h>
using namespace std;

//线程处理函数
void print() {
	Sleep(3000);
	cout << "子线程运行喽........" << endl;
}

                注:如果创建一个线程而不做处理,会调用abort函数中止程序

                        一个线程只能join一次,否则也会abort。

        1.1. 使用join()函数加入,汇合线程,阻塞主线程,等待子进程执行结束,才会回到主线程

int main(){
	//创建线程
	thread test1(print);
	test1.join();        //阻塞(若test1线程未执行完,则主线程不会打印)
	cout << "主线程运行喽........." << endl;
}

运行说明:三秒后依次打印出

 

1.2. 使用detach()函数,打破依赖关系,把子线程驻留后台

        注:线程detach后,就不能在join了 

int main(){
	//创建线程
	thread test1(print);
	test1.detach();
	cout << "主线程运行喽........." << endl;
}

运行说明:直接只打印出:

 

1.3 使用joinable()函数判断当前线程是否可以做join或者detach操作,若可以,返回true。

int main(){
	//创建线程
	thread test1(print);
	test1.detach();
	cout << "主线程运行喽........." << endl;
	if (test1.joinable())
		test1.join();
	else
		cout << "该子线程已经被处理啦....." << endl;
}

运行说明:

 

2.  通过类和对象创建线程

class Li {
public:

	//STL仿函数
	void operator()() {
		cout << "子线程启动喽....." << endl;
	}
};
int main(){
	//正常写法:对象充当线程处理函数
	Li li;
	thread test1(li);
	test1.join();

	Li(); //无名对象
	thread test2((Li()));   //这里如果不多写一个括号,编译器就会把test2解析成一个函数,Li()解析成一个参数,从而出错
	test2.join();
	
}

运行:

 

3. 带参的方式创建线程

//传引用可以改变num的实际值
void printInfo(int& num) {
	cout << "子线程运行喽...." << endl;
}
int main(){
	int num = 0;
	//ref 用于包装 “引用传递值” 
	thread test1(printInfo, ref(num));
	test1.join();
	cout << "我是主线程...." << endl;
	
}

运行:

4. Lambda表达式创建线程

int Max(int a, int b) {
	return a > b ? a : b;
}
int main(){
	int (*pMax)(int, int) = nullptr;
	pMax = [](int a, int b)->int {return a > b ? a : b; };
	[] {cout << "helloword" << endl; }();
	cout << pMax(3, 5) << endl;
	thread test1([] {cout << "我是子线程..." << endl; });
	test1.join();
	cout << "我是主线程..." << endl;
	return 0;
}

运行:

 

5. 以智能指针为参数创建线程

void print(unique_ptr<int> ptr) {
	cout << "我是子线程:" << ptr.get()<<endl;
}
int main(){
	int* p = new int(100);
	unique_ptr<int> ptr(p);
	cout << "我是主线程:" << ptr.get() << endl;
	thread test1(print, move(ptr)); //move移动语义,通俗的说就是把ptr移动到子线程中了,这样的话,主线程中的ptr就没了    
	test1.join();
	cout << "我是主线程:" << ptr.get()<<endl;
	
}

运行:

 

6. 以类的成员函数充当线程处理函数来创建线程

class Li {
public:
	void print(int& num) {
		num = 1001;
		cout << "我是子线程:" << this_thread::get_id() << endl;
	}
};
int main(){
	Li li;
	int num = 1007;
	//需要说明 是哪个对象
	thread test1(&Li::print,li,ref(num));
	test1.join();
	cout << "我是主线程:" << this_thread::get_id()<<endl;
	
}

运行:

 

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

智能推荐

Asp.NetCore使用自定义证书_asp.netcore 生成自定义证书pfx-程序员宅基地

文章浏览阅读1.2k次。Asp.NetCore的站点默认发布了http和https。但是他发布的https使用的默认证书有效期很短,为此使用自己申请的证书。1.首先到linux上安装openssl,然后执行下面命令# 生成私钥openssl genrsa -aes256 -passout "pass:mypassword" -out key.pem 4096# 生成公钥openssl req -new -x509 -days 3650 -key key.pem -passin "pass:mypassword" -out_asp.netcore 生成自定义证书pfx

Linux中rsyslog与journal对系统日志进行管理_rsyslog journal-程序员宅基地

文章浏览阅读3.2k次。系统日志在管理中的作用:系统日志具有审计与监测作用,通过对日志中相关信息的分析,可以检查系统发生错误的相关信息,实时进行监控。有效利用日志信息并会分析与监控管理,对维护系统安全性有重要作用。系统日志分类###系统日志一般存放在/var/log/file下/var/log/messages ###记录服务信息,系统报错信息等/var/log/secure ###存放用户认证相关信..._rsyslog journal

2021 年软件开发趋势大预测!-程序员宅基地

文章浏览阅读520次。点击上方“逆锋起笔”,公众号回复编程资源领取大佬们推荐的学习资料作者| Md Kamaruzzaman译者|张健欣策划| InfoQ蔡芳芳对于软件开发行业来说,2020 年是意..._未来软件开发技术的演变方向 csdn

linux内核更新前后配置文件的比较-程序员宅基地

文章浏览阅读1.1k次。说明:这里先给出一个比较的结果,作为记录,后续会给出内核配置差异的详细解释。[root@xiaolyu linux-4.7.2]# diff .config .config_bak 3c3< # Linux/x86_64 3.10.0-327.el7.x86_64 Kernel Configuration---> # Linux/x86 4.7.2 Kernel Configur..._kernel configuration config_arch_mmap_rnd_bits_min

单片机实验笔记(汇编、Proteus仿真)_protues的单片机基础实验与课程设计开关控制共阴极数码管 汇编语言-程序员宅基地

文章浏览阅读6.2k次,点赞32次,收藏141次。实验基础51单片机本门课程硬件平台为ATMEL公司的AT89C52单片机,在Proteus软件进行仿真实验。51单片机是8位单片机、8k ROM 、256bytes RAM、四个8位并行I/O口汇编语言本门课程使用汇编语言编程。51单片机汇编指令;汇编语言指令格式[标号:] 操作码 [第一操作数] [,第二操作数] [,第三操作数] [;注释] 操作码操作数字节数周期数数据传递类指令MOVA,Rn寄存器传送到累加器1MOVA,dire_protues的单片机基础实验与课程设计开关控制共阴极数码管 汇编语言

Java基于web的健康饮食信息管理系统(开题+源码)_基于web技术的家庭健康管理系统开题报告-程序员宅基地

文章浏览阅读264次。然而,如何在繁忙的生活中保持健康饮食,是许多人面临的挑战。该系统的研究意义在于,通过信息化的手段,帮助用户了解自己的饮食习惯,掌握食材的热量摄入,科学地进行饮食登记,记录运动情况,接收运动提醒,并得到个性化的饮食建议,从而更好地实现健康饮食的目标。本系统的研究目的在于解决现有健康饮食管理的痛点,通过构建一个具有用户友好性、易操作性的健康饮食信息管理系统,帮助用户提高健康饮食的意识,改善饮食习惯,实现健康生活。2023年4月至5月:文档编写和培训,编写用户手册和系统文档,并进行相关人员的培训。_基于web技术的家庭健康管理系统开题报告

随便推点

微信小程序云开发增删改查_微信小程序增删改查实例代码-程序员宅基地

文章浏览阅读384次。#####查询语句的第二种写法。_微信小程序增删改查实例代码

R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用plot函数可视化模型诊断图(第二幅图可视化QQ图、判断残差是否符合正态分布)-程序员宅基地

文章浏览阅读393次。R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用plot函数可视化模型诊断图(第二幅图可视化QQ图、判断残差是否符合正态分布)

加密文件如何解密?_文件解密-程序员宅基地

文章浏览阅读1.1k次。加密文件如何解密?_文件解密

腾讯面试之软件测试_腾讯广研软件测试复试-程序员宅基地

文章浏览阅读4.4k次,点赞3次,收藏5次。前期准备:看了一个星期的程序员面试宝典,并且参考了数据结构书籍。网申填写了一份电子简历,之后就按部就班的学习。结果简历筛选为过,未收到腾讯短信通知,有点郁闷,想就此结束,准备百度实习招聘。但是经过思想斗争,最后还会决定和同学一块参加了霸笔。笔试:霸笔的人被安排在一个房间,按填报岗位,分区入座。结果偌大的教室里竟然绝大部分都是研发。监考人员说这个房间的人不一定每人都有试卷。我来的较晚_腾讯广研软件测试复试

从零配置webpack-vue项目(2)-程序员宅基地

文章浏览阅读899次,点赞28次,收藏21次。const path = require(‘path’) //需要引入node模块const VueLoaderPlugin = require(‘vue-loader/lib/plugin’) //vue插件const HtmlWebpackPlugin = require(‘html-webpack-plugin’) //html插件//自动清理打包后文件插件entry:{},output:{ //导出文件配置。

[MATLAB&SIMULINK] 如何提取并处理Simscape Power System 中powergui的谐波分析数据-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏22次。花了一两个小时研究了一番powergui的fft。在powergui中,FFT Analysis Tool如图所示开发环境:MATLAB R2015a + Window 10 enterpirse那么如果我想提取出Simulink模型中的数据并且做fft处理,得到自己想要的分析图像,应该怎么办呢?方法一:其实MATLAB在这个过程中调用了power_fftscop..._simulink simscape 频谱

推荐文章

热门文章

相关标签