函数简介
      pthread_create是UNIX环境创建线程函数
    头文件
      #include
    函数声明

    1. int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict_attr,
    2. void*(*start_rtn)(void*), void *restrict arg);

      
    返回值
      若成功则返回0,否则返回出错编号
    参数
      第一个参数为指向线程标识符的指针。
      第二个参数用来设置线程属性。
      第三个参数是线程运行函数的地址。
      最后一个参数是运行函数的参数。
    注意
      在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。

    函数简介
      函数pthread_join用来等待一个线程的结束。
    函数原型为:

    1. extern int pthread_join __P (pthread_t __th, void **__thread_return);

    参数:
      第一个参数为被等待的线程标识符
      第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
    注意
    这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<pthread.h>
    4. /* 声明结构体 */
    5. struct member
    6. {
    7. int num;
    8. char *name;
    9. };
    10. /* 定义线程pthread */
    11. static void * pthread(void *arg)
    12. {
    13. struct member *temp;
    14. /* 线程pthread开始运行 */
    15. printf("pthread start!\n");
    16. /* 令主线程继续执行 */
    17. sleep(2);
    18. /* 打印传入参数 */
    19. temp = (struct member *)arg;
    20. printf("member->num:%d\n",temp->num);
    21. printf("member->name:%s\n",temp->name);
    22. return NULL;
    23. }
    24. /* main函数 */
    25. int main(int agrc,char* argv[])
    26. {
    27. pthread_t tidp;
    28. struct member *b;
    29. /* 为结构体变量b赋值 */
    30. b = (struct member *)malloc(sizeof(struct member));
    31. b->num=1;
    32. b->name="mlq";
    33. /* 创建线程pthread */
    34. if ((pthread_create(&tidp, NULL, pthread, (void*)b)) == -1)
    35. {
    36. printf("create error!\n");
    37. return 1;
    38. }
    39. /* 令线程pthread先运行 */
    40. sleep(1);
    41. /* 线程pthread睡眠2s,此时main可以先执行 */
    42. printf("mian continue!\n");
    43. /* 等待线程pthread释放 */
    44. if (pthread_join(tidp, NULL))
    45. {
    46. printf("thread is not exit...\n");
    47. return -2;
    48. }
    49. return 0;
    50. }

    编译与执行结果
    编译与执行结果如下图所示,可以看到主线程main和线程pthread交替执行。也就是说是当我们创建了线程pthread之后,两个线程都在执行,证明创建成功。另外,可以看到创建线程pthread时候,传入的参数被正确打印。
    pthread_create和pthread_join函数和pthread_detach - 图1

    pthread_detach
    1.linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
    2.unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join.
    3.其实简单的说就是在线程函数头加上 pthread_detach(pthread_self())的话,线程状态改变,在函数尾部直接 pthread_exit线程就会自动退出。省去了给线程擦屁股的麻烦。

    (1)pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收。

    (2)函数说明

    1)函数原型:int pthread_detach(pthread_t tid);

    2)功能:pthread_join()函数的替代函数,可回收创建时detachstate属性设置为PTHREAD_CREATE_JOINABLE的线程的存储空间。该函数不会阻塞父线程。pthread_join()函数用于只是应用程序在线程tid终止时回收其存储空间。如果tid尚未终止,pthread_detach()不会终止该线程。当然pthread_detach(pthread_self())也是可以得

    3)头文件:#include pthread非linux系统的默认库, 需手动链接-线程库 -lpthread

    4)参数:tid:线程标识符

    5)返回值:pthread_detach() 在调用成功完成之后返回零。其他任何返回值都表示出现了错误。如果检测到以下任一情况,pthread_detach()将失败并返回相应的值。

    EINVAL:tid是分离线程

    ESRCH:tid不是当前进程中有效的为分离线程

    (3)实例

    1. #include <stdlib.h>
    2. #include <unistd.h>
    3. #include <stdio.h>
    4. void print_message_function( void *ptr );
    5. main ( )
    6. {
    7. pthread_t thread1;
    8. pthread_create(&thread1,NULL,(void *)&print_message_function,(void *)0);
    9. int i;
    10. for(i=0;i<5;i++)
    11. {
    12. printf("%d\n",thread1);
    13. }
    14. exit (0) ;
    15. }
    16. void print_message_function( void *ptr )
    17. { pthread_detach(pthread_self());
    18. static int g;
    19. printf("%d\n", g++);
    20. pthread_exit(0) ;
    21. }

    pthread_create和pthread_join函数和pthread_detach - 图2
    //pthread_detach(pthread_self());
    //使线程分离出来。当这个线程执行完成任务后释放释放资源。不然它会保留退出状态,等待别人来取。
    pthread_detach(threadid)和pthread_detach(pthread_self())没有什么区别吧!有很严格的区别吗???如果非要讲区别不可,我觉得应该是调用他们的线程不同。
    pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态,一旦线程处于分离状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存(占用系统资源)直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态。通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程,这里的threadid是指子线程的threadid;如此以来,该子线程止时底层资源立即被回收;被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID;