c++ 学习之 多线程(三) thread类的成员函数

c++ 学习之 多线程(三) thread类的成员函数

前言

thread类提供了几个成员函数,由于构造函数之前有讲过,所以本文着重分析一下其他函数的用法。

正文

1.~thread()
在这里插入图片描述
析构函数,用来销毁thread对象,但是调用析构函数的前提必须是该thread对象是不可连接的,否则不可以。

2.joinable()
在这里插入图片描述

调用这个函数来判断该thread对象是否可连接,可以返回真,否则返回假。
以下几种是不可连接的:
*由默认构造函数创建的对象
*被移动过的对象
*调用过join()或detach()的对象
也就是一个执行着线程并且没有调用过join()和detach()的线程就是可连接的。
我们通常在调用join()和detach()调用joinable来防止多次调用join()和detach().
注意,只有不可连接的thread对象才可以通过调用析构函数来回收,否则将抛出异常。

3.join()
在这里插入图片描述

该函数起到加入等待的作用,调用该函数后,该函数将会在子线程结束后才会返回,它在子线程结束之前,会阻塞在那里,直到构造函数中的可调用对象(函数)结束后,函数返回。在调用这个函数后,thread对象将会不可连接,调用joinable()返回false。
我们通常在主线程结束之前调用这个函数来确保子线程在主线程之前执行完毕

4.detach()
在这里插入图片描述

该函数用于线程分离,调用该函数后子线程与主线程分离,彼此独立。两个线程会继续执行,并且不会相互影响,当任何一方结束后,该线程的资源都会被回收。调用完detach()后,对象变为不可连接,可以被安全的析构。
我们通常调用这个函数来让子线程从主线程中分离,以确保主线程的结束不受子线程的限制。但是这样有一个弊端,就是当主线程结束后,资源被释放,如果子线程中有使用主线程创建的实参,就会出现不可预料的事情(大概率崩溃,别问为啥,问就是崩过,呜呜呜)。

5.operator=
在这里插入图片描述

移动指定线程,=在thread类中被重载了。只有当对象不可连接的时候才可以使用,调用后,获得被移动对象的线程,被移动对象将不在执行任何线程。如果是可连接的,会抛出异常。注意,被移动的thread对象需要用std::move()转换为右值。

6.swap()
在这里插入图片描述
交换两个thread对象。

扫描二维码关注公众号,回复: 10372299 查看本文章

7.get_id()
返回线程id。

8.native_handle()

返回线程句柄。

9.hardware_concurrency()

获取硬件支持的并发线程数。正常返回支持的并发线程数,若值非良定义或不可计算,则返回 ​0。

发布了10 篇原创文章 · 获赞 6 · 访问量 413

猜你喜欢

转载自blog.csdn.net/weixin_45074185/article/details/104398804