当前位置: 首页 > news >正文

C++线程库的基本使用(初级)

#include<iostream>
#include<thread>
#include<string>
void printHelloWorld(std::string msg)
{
	std::cout << msg<< std::endl;
	return;
}
int main()
{
	std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名,第二个参数是上一个函数的参数
	threadl.join();//检查子线程有无return,等子线程结束后,主线程才会继续
	//threadl.detach();//分离主线程和子线程,主线程和子线程同时进行,主线程运行完之后或子线程结束后释放资源
	bool isJoin = threadl.joinable();//该函数判断线程能否使用join,detach
	//join只能使用一次,joinable判断有没有使用过join
	return 0;
} 
几个需要注意的点:

1.thread参数是引用时:

#include<iostream>
#include<thread>
void foo(int& x)
{
	x += 1;
}
int main()
{
	int a = 1;
	std::thread t(foo, std::ref(a));//使用std::ref()来告诉thread,这个参数是引用
	t.join();
	std::cout << a << std::endl;
	return 0;
} 

2.thread参数是不存在的:

#include<iostream>
#include<thread>
std::thread t;
void foo(int& x)
{
	x += 1;
}
void test()
{
	int a = 1;
	t = std::thread(foo, std::ref(a));
}
int main()
{
	test();
	t.join();//a是test函数的局部变量test结束后a已经被释放了
	         //这个线程已经引用不了a了,所以报错
	return 0;
} 
#include<iostream>
#include<thread>
void foo(int* x)
{
	std::cout << *x << std::endl;//x现在是野指针
}
int main()
{
	int* ptr = new int(1);
	std::thread t(foo, ptr);
	delete ptr;//此时子线程和主线程同时运行,子线程在运行时,x所指的已经被释放了,子线程运行需要一定的时间
	t.join();//主线程等待子线程运行结束
	return 0;
} 

注意:在C++中,std::thread的构造函数要求第一个参数是一个可调用的对象(函数指针、函数名、lambda表达式等),而不是一个类的成员函数。成员函数需要使用类的对象来调用,因此不能直接作为std::thread的参数。(成员函数不是函数名,是因为成员函数是与类对象相关联的函数,它需要一个类的对象来调用。而函数名只是一个标识符,可以与任何类型的函数相关联,包括成员函数和非成员函数。)

#include <iostream>
#include <thread>
class A {
public:
	void foo()
	{
		std::cout << "Hello" << std::endl;
	}
};
int main() {
	A a;
	std::thread t(&A::foo, &a);
	t.join();
	return 0;
}

可以用智能指针来防止内存泄漏

#include <iostream>
#include <thread>
class A {
public:
	void foo()
	{
		std::cout << "Hello" << std::endl;
	}
};
int main() {
	std::shared_ptr<A> a = std::make_shared<A>();
	std::thread t(&A::foo, a);
	t.join();
	return 0;
}

锁:

#include <iostream>
#include <thread>
#include <mutex>
int a = 0;
std::mutex mtx;
void func()
{
	for (int i = 0; i < 10000; i++)
	{
		mtx.lock();
		a += 1;
		mtx.unlock();
	}
}
int main() {
	std::thread t1(func);
	std::thread t2(func);
	t1.join();
	t2.join();
	std::cout << a << std::endl;
	return 0; 
}

http://www.dtcms.com/a/3701.html

相关文章:

  • RabbitMQ
  • 【MATLAB源码-第68期】基于matlab的802.11b 11Mbps CCK调制解调误码率仿真。
  • MapReduce性能优化之小文件问题和数据倾斜问题解决方案
  • javascript 算术运算符,比较运算符 ,逻辑运算符
  • WPF布局控件之DockPanel布局
  • 【计算机网络】数据链路层-MAC和ARP协议
  • 【C++】开源:rapidjson数据解析库配置与使用
  • 数据结构大体体系
  • 没网络也能安装.Net 3.5!如何脱机安装.NET Framework 3.5
  • 云尘 命令执行系列
  • 配置阿里云镜像加速器 -docker
  • 硬件加速器及其深度神经网络模型的性能指标理解
  • [算法日志]图论: 广度优先搜索(BFS)
  • NtripShare Caster高精度定位CORS服务软件
  • 【实践篇】一次Paas化热部署实践分享 | 京东云技术团队
  • 图像切分:将一张长图片切分为指定长宽的多张图片
  • element-ui 表格 点击选中
  • 中文大语言模型汇总
  • 城市内涝解决方案:实时监测,提前预警,让城市更安全
  • ESXi配置两个不同网段虚拟机互通
  • 考研408-计算机网络 第一章-计算机网络体系结构学习笔记及习题
  • 工具介绍——第三方软件远程连接(工具:Rustdesk)
  • 长短期神经网络LSTM的博文分类,长短期神经网络的原理分析
  • 【开题报告】基于uniapp的在线考试小程序的设计与实现
  • Python武器库开发-常用模块之subprocess模块(十九)
  • 技术分享 | App常见bug解析
  • CVE-2023-34040 Kafka 反序列化RCE
  • 【GEE】7、利用GEE进行遥感影像分类【随机森林分类】
  • 10 路由协议:西出网关无故人,敢问路在何方
  • 2、Sentinel基本应用限流规则(2)