【Linux】线程-线程控制

这篇具有很好参考价值的文章主要介绍了【Linux】线程-线程控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程控制

使用线程需要注意的是,需要引入头文件pthread.h,并且在编译的时候,需要使用-lpthread

线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)

thread:返回线程id
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:函数地址,即线程启动时要执行的函数
arg:传递给线程启动函数的参数
返回值:成功返回0,失败返回错误码

需要注意的是:pthread_create函数会产生一个线程ID,存放在第一个参数指向的地址中,而指向的这个地址其实是指向一个虚拟内存单元,这个内存单元的地址就是新创建的线程ID。
传入的thread,它的类型的pthread_t类型,那么这个类型是什么呢?

当前linux实现的标准线程库中,pthread_t的类型本质上是一个进程地址空间的一个首地址。

【Linux】线程-线程控制

线程终止

多个线程的编程而言,如果某个线程异常退出,会导致整个进程的退出,那么如果想要仅让某个线程退出,而不退出整个进程组,有三种方式。

return pthread_exit pthread_cancel
退出当前线程,主线程除外 谁调用谁退出 退出当前进程组中其他的线程
void pthread_exit(void* value_ptr);

value_ptr:指向一个在堆上开辟的空间

int pthread_cancel(pthread_t thread);

thread:线程ID
返回值:成功返回0,失败返回错误码

线程等待

线程在CPU看来也是一个PCB,那么当一个线程退出的时候,就需要和进程一样,对其进行资源回收,否则会造成内存泄漏。那么就需要和进程一样,进行线程等待,让其他线程去回收即将要退出的线程。
使用的函数是pthread_join

int pthread_join(pthread_t thread, void** value_ptr)

参数:
thread:线程ID
value_ptr:指向一个指针,指针指向线程的返回值
返回值:成功返回0,失败返回错误码

注意:该函数为阻塞类型的函数,调用这个函数的线程将阻塞等待,直到被等待的线程退出,该函数才会返回。传递的value_ptr需要执行一块堆上的空间,而且在上述不同的线程终止情况下,通过pthread_join得到的终止状态也是不同的。
但是一般来说,由于工作线程的运行时间是非常长的,并且不会让线程执行完某项工作后就退出,而且我们一般不关心线程退出的状态信息,故我们会传递NULL给pthread_join的第二个参数。

分离线程

当我们使用pthread_create函数创建线程后,新创建的线程默认是joinable的,就是说需要程序猿自己写线程回收的代码,用于回收当线程终止后的线程资源。但是这样使用起来也不方便,还容易遗忘,因此当我们不关心线程终止的返回值,就可以让线程自己在终止的时候,让操作系统自动回收线程资源。

分离的方式有两种:自己主动分离自己,其他线程分离当前线程。

int pthread_detach(pthread_t thread);

参数:thread:线程id,可以传递自己的线程id,也就是pthread_self()文章来源地址https://www.toymoban.com/news/detail-424941.html

到了这里,关于【Linux】线程-线程控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux: network: tools: tcpdump,抓取vlan包需要注意的事情;不然会出现LLC协议

    https://bugzilla.redhat.com/show_bug.cgi?id=498981#c4 https://serverfault.com/questions/544651/vlan-tags-not-shown-in-packet-capture-linux-via-tcpdump 加-e参数,可以将VLAN信息显示在console界面。 -e Print the link-level header on each dump line. This can be used, for example, to print MAC layer addresses for protocols such as Ethernet and IEEE

    2024年02月13日
    浏览(24)
  • linux:需要注意docker和aws的rds的mysql默认是UTC而不是中国时区

    问题:         如题 解决办法:         docker参考:                 mysql时间不对,修改时区_set global time_zone 无效_《小书生》的博客-CSDN博客         aws参考:                 https://www.youtube.com/watch?v=B-NaqV-A1BY                 mysql - AWS修改RDS时区

    2024年02月10日
    浏览(32)
  • 【Linux】Linux线程概念和线程控制

    线程是进程内的一个执行流。 我们知道,一个进程会有对应的PCB,虚拟地址空间,页表以及映射的物理内存。所以我们把这一个整体看做一个进程,即进程=内核数据结构+进程对应的代码和数据。我们可以这样看待虚存:虚拟内存决定了进程能够看到的\\\"资源\\\"。因为每一个进

    2024年02月04日
    浏览(30)
  • 使用C/C++举例说明使用宏定义时需要注意的各个点

    好的,下面我将分别举例说明使用宏定义时需要注意的各个点: (a)宏名和替换文本之间用空格分开: #define MAX_VALUE 100 // 正确的宏定义,MAX_VALUE是宏名,100是替换文本 不要写成等号连接的形式,否则会导致编译错误: #define MAX_VALUE=100 // 错误的宏定义,不应使用等号连接宏

    2024年03月21日
    浏览(52)
  • 【Linux】多线程——线程引入 | 线程控制

    一级页表和二级页表都是 key/val模型 ,一级页表的key是第一份的10个比特位,则有2 10 个key值,其val是第二份的10个比特位。第二份的10个比特位也就是二级页表的key,将一级页表和二级页表的key值组合起来就能找到要访问数据所在页的起始地址。第三份的12个比特位就是相对于

    2024年02月13日
    浏览(29)
  • 【Linux】线程-线程控制

    使用线程需要注意的是,需要引入头文件pthread.h,并且在编译的时候,需要使用 -lpthread thread:返回线程id attr:设置线程的属性,attr为NULL表示使用默认属性 start_routine:函数地址,即线程启动时要执行的函数 arg:传递给线程启动函数的参数 返回值:成功返回0,失败返回错误码 需

    2023年04月25日
    浏览(22)
  • linux——多线程,线程控制

    目录 一.POSIX线程库 二.线程创建 1.创建线程接口 2.查看线程 3.多线程的健壮性问题 4.线程函数参数传递 5.线程id和地址空间 三.线程终止 1.pthread_exit 2.pthread_cancel 四.线程等待  五.线程分离 站在内核的角度,OS只有轻量级进程,没有线程的概念,但是站在用户的角度我们只有线

    2024年02月08日
    浏览(36)
  • 【Linux】多线程1——线程概念与线程控制

    📝 个人主页 :超人不会飞) 📑 本文收录专栏 :《Linux》 💭 如果本文对您有帮助,不妨 点赞、收藏、关注 支持博主,我们一起进步,共同成长! 💭理解线程需要和进程的概念紧密联系。 线程是一个执行分支,执行粒度比进程更细,调度成本更低; 进程是分配系统资源的

    2024年02月12日
    浏览(21)
  • Linux 多线程( 进程VS线程 | 线程控制 )

    进程是资源分配的基本单位。 线程是OS调度的基本单位。 线程共享进程数据,但也拥有自己的一部分数据: 线程ID 一组寄存器 ,用来保存每个线程的上下文数据,让每个线程能够合理调度。 栈 ,每个线程入栈出栈产生的临时变量必须保存到每个线程的私有栈中,所以栈对于

    2024年02月07日
    浏览(33)
  • 【Linux学习】多线程——线程控制 | 线程TCB

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! Linux内核中并不存在线程的概念,我们程序员是通过库来使用线程的,这个库是POSIX线程库,是由原生线程库提供的,它遵守POSIX标准,就像之前学过的System V标准一样。POSIX线程库有以

    2024年02月05日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包