时间:2021-07-01 10:21:17 帮助过:5人阅读
#include<stdio.h>
2 #include<pthread.h>
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 }
可以看出:
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<stdio.h>
2 #include<pthread.h>
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 }
如果把子线程中的pthread_detach(pthread_self())注释掉,则结果如下,这是因为把子线程中分离去掉后,其他线程就可以对子线程进程join和杀死,然后释放掉存储器资源。而上面是因为在子进程中已经分离的,所以其他线程不能在对其访问了,join返回fail

总结:
线程的控制从创建线程-->子线程的三种终止方式-->其他线程join线程。终止的方式不同,join的返回值就不同。线程的分离,如果子线程中加入pthread_detach()就把子线程设置成了可分离的线程,线程退出后会自动释放存储器资源,不会造成内存泄漏。如果不设置的话,就要用join显示接收,然后释放资源,也不会造成内存泄漏。
以上就是Linux--线程的控制与分离的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!