C 线程的使用~(下)

2.3 detach()

detach() 函数的作用是进行线程分离,分离主线程和创建出的子线程。在线程分离之后,主线程退出也会一并销毁创建出的所有子线程,在主线程退出之前,它可以脱离主线程继续独立的运行,任务执行完毕之后,这个子线程会自动释放自己占用的系统资源。(其实就是孩子翅膀硬了,和家里断绝关系,自己外出闯荡了,如果家里被诛九族还是会受牵连)。该函数函数原型如下:

void detach();

线程分离函数没有参数也没有返回值,只需要在线程成功之后,通过线程对象调用该函数即可,继续将上面的测试程序修改一下:

int main()
{cout << "主线程的线程ID: " << this_thread::get_id() << endl;thread t(func, 520, "i love you");thread t1(func1);cout << "线程t 的线程ID: " << t.get_id() << endl;cout << "线程t1的线程ID: " << t1.get_id() << endl;t.detach();t1.detach();// 让主线程休眠, 等待子线程执行完毕this_thread::sleep_for(chrono::seconds(5));
}

注意事项:线程分离函数 detach () 不会阻塞线程,子线程和主线程分离之后,在主线程中就不能再对这个子线程做任何控制了,比如:通过 join () 阻塞主线程等待子线程中的任务执行完毕,或者调用 get_id () 获取子线程的线程 ID。有利就有弊,鱼和熊掌不可兼得,建议使用 join ()。

2.5 joinable()

joinable() 函数用于判断主线程和子线程是否处理关联(连接)状态,一般情况下,二者之间的关系处于关联状态,该函数返回一个布尔类型:

  • 返回值为 true:主线程和子线程之间有关联(连接)关系

  • 返回值为 false:主线程和子线程之间没有关联(连接)关系

bool joinable() const noexcept;

示例代码如下:

#include 
#include 
#include 
using namespace std;void foo()
{this_thread::sleep_for(std::chrono::seconds(1));
}int main()
{thread t;cout << "before starting, joinable: " << t.joinable() << endl;t = thread(foo);cout << "after starting, joinable: " << t.joinable() << endl;t.join();cout << "after joining, joinable: " << t.joinable() << endl;thread t1(foo);cout << "after starting, joinable: " << t1.joinable() << endl;t1.detach();cout << "after detaching, joinable: " << t1.joinable() << endl;
}

示例代码打印的结果如下:

before starting, joinable: 0
after starting, joinable: 1
after joining, joinable: 0
after starting, joinable: 1
after detaching, joinable: 0

基于示例代码打印的结果可以得到以下结论:

  • 在创建的子线程对象的时候,如果没有指定任务函数,那么子线程不会启动,主线程和这个子线程也不会进行连接

  • 在创建的子线程对象的时候,如果指定了任务函数,子线程启动并执行任务,主线程和这个子线程自动连接成功

  • 子线程调用了detach()函数之后,父子线程分离,同时二者的连接断开,调用joinable()返回false

  • 在子线程调用了join()函数,子线程中的任务函数继续执行,直到任务处理完毕,这时join()会清理(回收)当前子线程的相关资源,所以这个子线程和主线程的连接也就断开了,因此,调用join()之后再调用joinable()会返回false。

2.6 operator=

线程中的资源是不能被复制的,因此通过 = 操作符进行赋值操作最终并不会得到两个完全相同的对象。

// move (1) 
thread& operator= (thread&& other) noexcept;
// copy [deleted] (2) 
thread& operator= (const other&) = delete;

通过以上 = 操作符的重载声明可以得知:

  • 如果 other 是一个右值,会进行资源所有权的转移

  • 如果 other 不是右值,禁止拷贝,该函数被显示删除(=delete),不可用

3. 静态函数

thread 线程类还提供了一个静态方法,用于获取当前计算机的 CPU 核心数,根据这个结果在程序中创建出数量相等的线程,每个线程独自占有一个 CPU 核心,这些线程就不用分时复用 CPU 时间片,此时程序的并发效率是最高的。

static unsigned hardware_concurrency() noexcept;

示例代码如下:

#include 
#include 
using namespace std;int main()
{int num = thread::hardware_concurrency();cout << "CPU number: " << num << endl;
}

4. C 线程库

C 语言提供的线程库不论在 window 还是 Linux 操作系统中都是可以使用的,看明白了这些 C 语言中的线程函数之后会发现它和上面的 C 线程类使用很类似(其实就是基于面向对象的思想进行了封装),但 C 的线程类用起来更简单一些,链接奉上,感兴趣的可以一看。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

e92f7360250577a47a8febb4946da3a8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javafx有布局管理器吗_JavaFX技巧17:带有AnchorPane的动画工作台布局

javafx有布局管理器吗最近&#xff0c;我不得不为应用程序实现一个布局&#xff0c;其中可以根据用户是否登录来隐藏或显示菜单区和状态区&#xff0c;并通过滑入/滑出动画显示该区域。 以下视频显示了实际的布局&#xff1a; 过去&#xff0c;我可能会使用自定义控件和自定义…

linux双wan网关负载均衡,Csico2951路由器,如何做到双WAN口负载均衡?

Router2800(config-if)#ip addressY.Y.Y.Y 255.255.255.252(Y为移动地址)Router2800(config-if)#ip nat ouosideRouter2800(config-if)#no shutdownRouter (config)#ip dns serverRouter (config)#ip name-server A.A.A.A B.B.B.B(A为电信解析地址&#xff0c;B为移动解析地址)…

用c语言编写爱心的代码是什么

用c语言编写爱心的代码&#xff1a;输入完整代码如下&#xff1a;#include int main(void){float a,x,y;for(y1.5f; y>-1.5f; y-0.1f){for(x-1.5f; x<1.5f; x 0.05f){a x*x y*y-1;char ch a*a*a-x*x*y*y*y<0.0f?*: ; putchar(ch); }printf("\n");}retur…

c++ lambda 重载_您会后悔对Lambdas应用重载!

c lambda 重载编写好的API很难。 非常辛苦。 如果您希望用户喜欢您的API&#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡&#xff1a; 用处 易用性 向后兼容 前向兼容性 之前&#xff0c;在我们的文章&#xff1a; 如何设计良好的常规API中&#xf…

linux1到10累加,10个有趣的 Linux 命令

在终端工作是一件很有趣的事情。今天&#xff0c;我们将会列举一些有趣得为你带来欢笑的Linux命令。1. rev创建一个文件&#xff0c;在文件里面输入几个单词&#xff0c;rev命令会将你写的东西反转输出到控制台。# revSelection_002Selection_0012. fortune这个命令没有被默认安…

7个华为关于C语言的经典面试题

1、找错void test1(){ char string[10]; char* str1"0123456789"; strcpy(string, str1);}这里string数组越界&#xff0c;因为字符串长度为10&#xff0c;还有一个结束符’\0’。所以总共有11个字符长度。string数组大小为10&#xff0c;这里越界了。PS&am…

java8 函数式编程_Java 8函数式编程:延迟实例化

java8 函数式编程单例通常会延迟实例化自己&#xff0c;有时&#xff0c;如果对象足够重&#xff0c;则可以延迟实例化类字段。 通常&#xff0c;在走惰性路线时&#xff0c;getter方法&#xff08;或accessor &#xff09;必须具有一段代码&#xff0c;该代码块在返回对象之前…

linux数组操作 增删改查,linuxea:go数组与数组增删改查(19)

复合数据类型是集合类&#xff0c;并且可以存储多个单值。在golang中存储的数组是相同的数据类型&#xff0c;并且长度也是其中的一个属性。在go中&#xff0c;数组的长度一旦定义&#xff0c;就不可变。如果声明了长度的变量&#xff0c;只能赋值相同的长度的数组数组是具有相…

C语言的特点与创建的基本步骤是什么

C语言的特点与创建的基本步骤是&#xff1a;C 语言特点&#xff1a;1.C语言是一种成功的系统描述语言&#xff0c;用C语言开发的UNIX操作系统就是一个成功的范例;2.同时C语言又是一种通用的程序设计语言&#xff0c;在国际上广泛流行。世界上很多著名的计算公司都成功的开发了不…

谷歌guava_Google Guava:您永远不会知道的5件事

谷歌guava每个开发人员可以使用哪些鲜为人知的Google Guava功能&#xff1f; 它是那里最受欢迎的库之一&#xff0c;它是开源的&#xff0c;您可能已经知道了&#xff0c;它来自人们玩Quidditch作为一项真正的运动的地方&#xff08;至少在The Internship上 &#xff09;。 它…

c语言中prime的作用,C语言判断素数prime

《C语言判断素数prime》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言判断素数prime(2页珍藏版)》请在人人文库网上搜索。1、主函数&#xff1a;#include int prime();void main()int number;int flag;printf (请输入一个大于1的整数:);scanf (%d,&number)…

C语言strcmp函数用法

C语言strcmp函数用法strcmp函数语法为“int strcmp(char *str1,char *str2)”&#xff0c;其作用是比较字符串str1和str2是否相同&#xff0c;如果相同则返回0&#xff0c;如果不同&#xff0c;前者大于后者则返回1&#xff0c;否则返回-1。简单示例&#xff1a;char a[]"…

Linux C 服务器端这条线怎么走?

在校学生的编程语言和数据结构的基础还不错&#xff0c;我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫&#xff0c;然后才去读编程方面的 APUE、UNP 等书。下面简单谈谈我对学习这两门课的看法和建议&#xff0c;都是站在服务端程序员的角度&#xff0c;从实用…

tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息

tp3 默认模块 默认方法因此&#xff0c;默认方法是……昨天的新闻&#xff0c;对不对&#xff1f; 是的&#xff0c;但是使用了一年之后&#xff0c;积累了很多事实&#xff0c;我想将这些事实收集在一个地方&#xff0c;供刚开始使用它们的开发人员使用。 甚至有经验的人都可以…

熟悉c语言,实验一 熟悉C语言的运行环境

《实验一 熟悉C语言的运行环境》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《实验一 熟悉C语言的运行环境(8页珍藏版)》请在人人文库网上搜索。1、实验一 熟悉C语言的运行环境一、 实验目的1. 熟悉C语言运行环境。2. 掌握语言程序的书写格式和语言程序的结构。3. 掌…

存储过程 锁定并发_Java并发教程–锁定:显式锁定

存储过程 锁定并发1.简介 在许多情况下&#xff0c;使用隐式锁定就足够了。 有时&#xff0c;我们将需要更复杂的功能。 在这种情况下&#xff0c; java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时&#xff0c;这些锁的内部机制与隐式锁相同。 区别在于…

C语言 PK 各大编程语言

今天分享一篇关于C语言为何如此有魅力的文章&#xff0c;如果你还在学习哪门语言的路口抉择&#xff0c;建议可以认真看看~以下为CSDN译文&#xff1a;没有什么技术可以应用长达50年之久&#xff0c;除非它真的比大多数其他东西都要好用——对于一种计算机行业的技术来说尤其如…

c语言线性表拷贝,数据结构(C语言版)---线性表顺序存储表示

1、顺序表&#xff1a;线性表的顺序存储&#xff0c;用一组地址连续的存储单元存储线性表中的数据元素。1) 特点&#xff1a;随机访问&#xff0c;即通过首地址和元素序号可在时间O(1)内找到指定元素。表中元素的逻辑顺序与其物理顺序相同&#xff0c;线性表中元素的位序是从1开…

nifty ui_Nifty JUnit:在方法和类级别上使用规则

nifty ui如Nifty JUnit&#xff1a;使用临时文件一文中所示 &#xff0c;可以在JUnit测试中使用Rule &#xff0c;这是方法级别的规则。 在此示例中&#xff0c;我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法&#xff08;就像Before &#xf…

在switch语句中,case后的标号只能是什么?

switch语句用于基于不同条件执行不同动作。语法格式&#xff1a;switch (变量表达式){case 常量1: 语句;break;case 常量2: 语句;break;case 常量3: 语句;break;...case 常量n: 语句;break;default: 语句;break;}switch语句是一个条件选择语句&#xff0c;找到相同的…