0

0

Linux--线程的控制与分离

黄舟

黄舟

发布时间:2017-01-18 10:34:45

|

1772人浏览过

|

来源于php中文网

原创

一、线程的概念
线程是进程内部的一个基本执行流,是系统调度的一个实体。进程具有独占性,线程具有共享性。各线程共享进程的文件描述符、信号处理的方式、当前的工作目录、用户id(uid)和组id(gid)。但是有些资源线程是私有的,比如线程id、栈空间、上下文(包括各种寄存器的值。程序计数器和栈指针)、占空间、信号屏蔽字、调度优先级。就好比进程如果是一个家庭的话,线程就是这个家庭的成员,每个家庭的成员都有一个公共的空间(餐厅,客厅)。当然每个家庭成员也有自己的私人空间了。

二、线程的控制
创建线程和终止
用函数pthread_create()创建,成功返回0,失败返归错误号。调用 pthread_create()创建新的线程后。当前线程从pthread_create()返回继续往下执行。新的线程所执行的代码由函数指针start_routine决定。函数start_routine函数接收一个参数,是通过pthread_create()的arg传给它的。类型为void*,start_toutine的返回值类型也是void*,start_toutine返回后,这个线程就退出了,其他线程可以调用pthread_join()得到start_toutine的返回值。start_toutine函数可以通过①return(void*)、②pthread_exit(void*)、③pthread_cancel(pthread_self())三种终止。

 #include  
  2 #include  
  3 void * thread_run(void* arg)  
  4 {  
  5     int count=5;  
  6     while(1)  
  7     {  
  8         printf("this is a thread,thread id is\n"pthread_self());  
  9         sleep(1);  
 10     }  
 11     //return (void*)1;  
 12     //pthread_exit((void*)2);  
 13     // pthread_cancel(pthread_self());  
 14 }  
 15 int main()  
 16 {  
 17     pthread_t id;  
 18     int ret=pthread_create(&id,NULL,thread_run,NULL);  
 19     int count=10;  
 20     while(count-->0)  
 21     {  
 22         printf("this is a main thread,thread id is %u\n",pthread_self());  
 23         sleep(1);  
 24     }  
 25     void * ted=0;  
 26     pthread_cancel(id);  
 27     pthread_join(id,&ted);  
 28     printf("return success %d\n",(int)ted);  
 29 }

321.jpg

可以看出:
1、如果通过return返回。pthread_join接收的值是线程的返回值

2、如果线程被别的线程调用pthread_cancel异常终止掉。则返回错误码

3、如果是调用pthread_exit终止的。pthread_join存放的是传给pthread_exit的参数。

4、两个线程的线程号是不一样的

三、线程分离
线程在任一个时间点上。是可结合的(joinable)或者是可分离的(detached)。可结合的线程可被其他的线程回收资源和杀死。在被其他线程回收之前,它的存储器资源是不释放的。而可分离的线程是不能被其他回收或杀死的,它的存储器资源在它终止时由系统自动释放。默认情况下。线程被创建成可结合的。为了避免内存泄漏,每个可结合的线程都应该要么被显示的回收,即调用pthread_join;要么通过pthread_detach函数分离。
如果如果一个可结合线程结束运行但没有被pthread_join,则它的状态类似于进程中的僵尸进程,即还有一部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞。这是可以在子线程中加入代码pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)非阻塞,可立即返回。这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。

1 #include  
  2 #include  
  3 void* thread_run(void* arg)  
  4 {  
  5     pthread_detach(pthread_self()); //分离线程  
  6     printf("this is a thrad \n");  
  7     return (void*)1;  
  8 }  
  9 int main()  
 10 {  
 11     pthread_t id;  
 12     int ret= pthread_create(&id,NULL,thread_run,NULL);  
 13     printf("this is a main thread\n");  
 14     sleep(1);  
 15   
 16     int res=pthread_join(id,NULL);  
 17     if(res==0)  
 18     {  
 19         printf("pthrad wait succced\n");  
 20         return 0;  
 21     }  
 22     else  
 23     {  
 24         printf("pthread wait faile\n");  
 25         return 1;  
 26     }  
 27     return 0;  
 28 }

322.jpg

如果把子线程中的pthread_detach(pthread_self())注释掉,则结果如下,这是因为把子线程中分离去掉后,其他线程就可以对子线程进程join和杀死,然后释放掉存储器资源。而上面是因为在子进程中已经分离的,所以其他线程不能在对其访问了,join返回fail

西安网上购物网店系统
西安网上购物网店系统

西安网上购物网店系统的主要亮点:(1)商品的分类更加细化和明朗,可以三级分类,价格可以多层次\多级别,按照后台设置的,吸引会员加入。(2)会员和非会员购物并存,订单直接支付和会员帐户支付并存,电话支付与网上支付多种支付方式。(3)自定义商品扩展属性,多种扩展属性定义模式,强大的商品管理功能,多重分类功能(4)灵活的会员积分系统,灵活的会员权限控制,模版丰富多彩,模版代码分离,方便修改模版(5)支付

下载

323.jpg

总结:
线程的控制从创建线程-->子线程的三种终止方式-->其他线程join线程。终止的方式不同,join的返回值就不同。线程的分离,如果子线程中加入pthread_detach()就把子线程设置成了可分离的线程,线程退出后会自动释放存储器资源,不会造成内存泄漏。如果不设置的话,就要用join显示接收,然后释放资源,也不会造成内存泄漏。

以上就是Linux--线程的控制与分离的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

8

2026.02.05

控制反转和依赖注入区别
控制反转和依赖注入区别

本专题整合了控制反转和依赖注入区别、解释、实现方法相关内容。阅读专题下面的文章了解更多详细教程。

11

2026.02.05

钉钉脑图插图教程合集
钉钉脑图插图教程合集

本专题整合了钉钉脑图怎么插入图片、钉钉脑图怎么用相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.02.05

python截取字符串方法汇总
python截取字符串方法汇总

本专题整合了python截取字符串方法相关合集,阅读专题下面的文章了解更多详细内容。

2

2026.02.05

Java截取字符串方法合集
Java截取字符串方法合集

本专题整合了Java截取字符串方法汇总,阅读专题下面的文章了解更多详细操作教程。

1

2026.02.05

java 抽象方法
java 抽象方法

本专题整合了java抽象方法定义、作用教程等内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.05

Eclipse创建jsp文件教程合集
Eclipse创建jsp文件教程合集

本专题整合了Eclipse创建jsp文件、创建jsp项目等等内容,阅读专题下面的文章了解更多详细教程。

26

2026.02.05

java 字符串转数字
java 字符串转数字

本专题整合了java如何字符串转数字相关内容,阅读专题下面的文章了解更多详细教程。

4

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.5万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号