【C++11】多线程-----创建与使用线程

举报
人才程序员 发表于 2023/10/29 20:37:55 2023/10/29
【摘要】 @TOC 前言本节课我们奖的是C++ 11多线程的创建与使用线程我们多线程的意义在哪:充分利用CPU资源、简化编程模式、简化异步事件处理、使GUI更有效率…提示:以下是本篇文章正文内容,下面案例可供参考 创建多线程及lambad表示式的讲解1.头文件:多线程的头文件为:#include <thread> using namespace std;2.怎么创建线程?首先我们要知道,线程就是一可...

@TOC


前言

本节课我们奖的是C++ 11多线程的创建与使用线程
我们多线程的意义在哪:充分利用CPU资源、简化编程模式、简化异步事件处理、使GUI更有效率…


提示:以下是本篇文章正文内容,下面案例可供参考

创建多线程及lambad表示式的讲解

1.头文件:
多线程的头文件为:#include <thread> using namespace std;

2.怎么创建线程?
首先我们要知道,线程就是一可调用的函数,在C++中,可以使用函数做为入口,也可以用类,类成员函数。main函数也是一个线程,但他是主线程,主线程的结束是在main函数return时,我们自己创建的子线程也是一样:
1).用函数做为入口函数:

void myprint()
{
	cout << "my name is \"my print\"" << endl;
}
int main()
{
	thread t(myprint);//创建一个入口函数为myprint子线程
	return 0;
}

2.用一个类作入口函数

class A
{
public:
	void operator() ()
	{
		cout << "my name is \" A operator\"" << endl;
	}
};
int main()
{
	A a;
	thread t(a);//以一个类对象为入口函数,需要重载"()"并且没有参数
	return 0;
}

3).用类中的函数成员作为入口函数

class A
{
public:
	void fun()
	{
		cout << "fun" << endl;
	}
};
int main()
{
	A a;
	thread t(&A::fun,&a);//我们构造函数的参数1需要函数的地址,参数2为哪个对象的地址
	system("pause>0");
	return 0;
}

使用

说了这么多,没有给我们看到效果啊,别急下面就是使用(有坑):

1).join函数
作用:主线程等待子线程执行完后再执行主线程,阻塞的。

class A
{
public:
	void fun()
	{
		cout << "fun" << endl;
	}
};
int main()
{
	A a;
	thread t(&A::fun,&a);
	t.join();//启动子线程
	return 0;
}

2).detach函数
作用:主线程和子线程一起执行,当主线程没了,子线程就会交给系统管理了,就失去了我们的控制

class A
{
public:
	void fun()
	{
		cout << "fun" << endl;
	}
};
int main()
{
	A a;
	thread t(&A::fun,&a);
	t.detach();
	return 0;
}

3).joinable函数
作用:判断是否可以join/detach true为可以,false为不可以

class A
{
public:
	void fun()
	{
		cout << "fun" << endl;
	}
};

int main()
{
	A a;
	thread t(&A::fun,&a);
	if(t.joinable())
	{
		cout<<"t 未join/detach"<<endl;
	}
	return 0;
}

detach大坑以及一些其他函数

1.传递字符串指针时,我们可以使用容器:const string,原因:
因为我们不知道主线程执行完后,子线程是否在执行,如果主线程没了,内存被回收了,完了:指针指向的东西变不可控了,所以传他

2.参数也不能有引用(detach情况下):和(1)原因基本一样:
如果真的想传引用,使用函数:std::ref();

3.传递类时,尽量构造临时对象进行传递

其他函数:std::this_thread();
查看此线程的id

智能指针的传递

创建:unique_ptr<类型>(指向的变量)
创建他时需要使用std::move()移动语义函数
入口参数也需要遵守上面讲参数的一些规则

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。