POSIX threads中joinable和detached线程的区别

POSIX threads中joinable和detached线程的区别

创建方式

这里都以Linux下的实现为例,进行说明。

joinable的创建方式

posix thread默认创建出来的线程就是joinable方式,所以创建方式十分简单

#include <pthread.h>
#include <string.h>
result = pthread_create (&server, NULL, thread_body, connfd);
if (result) fprintf (stderr, "pthread_create: %s", strerror (result));
pthread_join(server, &status);

detached线程创建方式

需要在thread_create的时候传入一下特殊的标志。

#include <pthread.h> 
#include <string.h>
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
result = pthread_create (&server, &attr, thread_body, connfd);
if (result) fprintf (stderr, "pthread_create: %s", strerror (result));

区别

detached线程的特点是,当一个detached线程终止时,它的资源可以立即释放,而不需要等待其它线程调用pthread_join之后才能释放资源。

简而言之,创建一个detached线程意味着你不需要等待它的完成,并且它的资源可以在线程终止时立即释放,而不需要等待其他线程的合并操作。在一些情况下可能带来性能上的改进,特别是当你知道你不需要调用pthread_join去等待线程完成,thread结束后可以立即释放它所占用的资源时。

相反joinable的线程即使结束了也不会释放资源,它需要一直等到有人调用了pthread_join之后,在完成时才会被释放。这意味着如果一个joinable线程你创建之后,不调用pthread_join,它将会永远的无法被释放,直到程序退出,被系统强行清理。