线程:相当于进程的一个执行流。一个进程可以有多个执行流,也就是说一个进程可以有多个线程。一个只有一个执行流的进程也可以看做线程。线程是操作系统调度和分派的基本单位。

  虽然一个进程中的多个线程共享一份地址空间,但每个线程也有各自私有的资源,即每个线程即是相互联系的又相互独立。

线程终止:

  1. 从线程函数return

  2. 线程函数调用pthread_exit();

  3. 调用函数pthread_cancel(pthread_t pthread);(可以在线程函数内部自己调用,也可以被其他同一进程的线程调用终止,但是结果不同)

线程ID可用 pthread_self()函数获得。


线程分离:

线程可分为可结合的和分离的,一般创建出的线程都是可结合的。可结合的线程可以被其他线程杀死和回收资源,但被回收前,其存储器资源是不释放的。要调用pthread_join()函数回收资源。分离线程不可以被其他线程杀死和回收资源,其存储其资源在其终止时自动被系统回收。

可以用下面的函数将一个线程设置为分离的,将线程设置为分离的后,不可以再调用pthread_join()函数了。也就是说分离函数与pthread_join()函数是冲突的。

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<stdlib.h>
  4 void* thread1(void* arg)
  5 {
  6     int count =3;
  7     while(count--)
  8     {
  9         printf("this is %d thread,%u\n",(int)arg,pthread_self());
 10         sleep(1);
 11     }
 12     return (void*)3;
 13 }
 14 void* thread2(void* arg)
 15 {
 16     //pthread_detach(pthread_self()); //线程分离函数。
 17     int count =3;
 18     while(count--)
 19     {
 20         printf("this is %d thread,%u\n",(int)arg,pthread_self());
 21         sleep(1);
 22     }
 23     pthread_exit((void*)4);
 24 }
 25 void* thread3(void* arg)
 26 {
 27     int count =3;
 28     while(count--)
 29     {
 30         printf("this is %d thread,%u\n",(int)arg,pthread_self());
 31         sleep(1);
 32     }
 33 }
 34 int main()
 35 {
 36     pthread_t tid1,tid2,tid3;
 37     pthread_create(&tid1,NULL,thread1,(void*)1); //创建线程
 38     pthread_create(&tid2,NULL,thread2,(void*)2);
 39     pthread_create(&tid3,NULL,thread3,(void*)3);
 40     int count =5;
 41     while(count--)
 42     {
 43         printf("this is main,%u\n",pthread_self());
 44         sleep(1);
 45     }
 46     void *retval=NULL;
  47     int res = pthread_join(tid1,&retval); //线程等待
 48     if(res==0)
 49     {
 50         printf("pthread_join succeed,%d\n",(int)retval);
 51     }
 52     res = pthread_join(tid2,&retval);
 53     if(res==0)
 54     {
 55         printf("pthread_join succeed,%d\n",(int)retval);
 56     }
 57     sleep(1);
 58     pthread_cancel(tid3);
 59     res = pthread_join(tid3,&retval);
 60     if(res==0)
 61     {
 62         printf("pthread_join succeed,%d\n",(int)retval);
 63     }
 64     return 0;
 65 }
   
结果:   
[fbl@localhost thread]$ ./creat
this is main,3078321856
this is 2 thread,3067829104
this is 3 thread,3057339248
this is 1 thread,3078318960
this is main,3078321856
this is 2 thread,3067829104
this is 3 thread,3057339248
this is 1 thread,3078318960
this is main,3078321856
this is 2 thread,3067829104
this is 3 thread,3057339248
this is 1 thread,3078318960
this is main,3078321856
this is main,3078321856
pthread_join succeed,3
pthread_join succeed,4
pthread_join succeed,0   

//将线程2设置为分离的后,继续调用pthread_join()函数
pthread_join succeed,3
pthread_join succeed,0


总结:

从上面代码的执行结果来看:

当把函数设置为分离的,在调用pthread_join()函数后会等待错误。