pthread_detach 设置线程分离
默认情况下,线程是可连接的(也可称为结合态)。通俗地说,就是当线程退出时,其他线程可以通过调用 pthread_join()
函数获取其返回状态。但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用 pthread_detach()
函数并向 thread
参数传入指定线程的标识符,将该线程标记为分离状态(分离态)。
#include <pthread.h> int pthread_detach(pthread_t thread);点击复制复制失败已复制
一旦线程处于分离态,就不能再使用 pthread_join()
函数来获取其状态,也无法使其重返“可连接”状态。下面的代码演示了线程的分离操作:
#include <pthread.h> #include <stdio.h> #define errlog(errmsg) \ do { \ perror(errmsg); \ printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__); \ return -1; \ } while (0) void *thread_handler(void *arg) { pthread_detach(pthread_self()); int count = *((int *)arg); while (count > 0) { printf("thread2...\n"); sleep(1); count--; } return NULL; } int main(int argc, const char *argv[]) { pthread_t thread; int arg = 3; if (pthread_create(&thread, NULL, thread_handler, (void *)&arg) != 0) { errlog("pthread_create error"); } sleep(1); if (pthread_join(thread, NULL) == 0) { printf("pthread wait success\n"); } else { printf("pthread wait failed\n"); } return 0; }点击复制复制失败已复制
通过代码可以看出,在程序运行 1
秒后,已经成为分离态的线程,不会被 pthread_join()
函数等待回收。
编译并运行,结果如下:
$ gcc main.c -lpthread && ./a.out thread2... pthread wait failed点击复制复制失败已复制
pthread_attr_setdetachstate 实现线程分离
同理,针对上述设置线程分离状态的方法,也可以在线程刚一创建时即进行分离(而非之后再调用 pthread_detach()
函数)。首先可以采用默认的方式对线程属性结构进行初始化,接着为创建分离线程而设置属性,最后再以此线程属性结构来创建新线程,线程一旦创建,就无需再保留该属性对象。最后将其销毁。
初始化线程属性结构及摧毁函数如下:
#include <pthread.h> int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr);点击复制复制失败已复制
设置线程分离状态的函数为 pthread_attr_setdetachstate()
。
#include <pthread.h> int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);点击复制复制失败已复制
参数 detachstate
用来设置线程的状态,设置 PTHREAD_CREATE_DETACHED
(分离态)与 PTHREAD_CREATE_JOINABLE
(结合态)。
#include <pthread.h> #include <stdio.h> #define errlog(errmsg) \ do { \ perror(errmsg); \ printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__); \ return -1; \ } while (0) void *thread_handler(void *arg) { printf("thread...\n"); return NULL; } int main(int argc, const char *argv[]) { pthread_t thread; pthread_attr_t attr; if (pthread_attr_init(&attr) != 0) { errlog("pthread_attr_init error"); } if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) { errlog("pthread_attr_setdetachstate error"); } if (pthread_create(&thread, &attr, thread_handler, NULL) != 0) { errlog("pthread_create error"); } sleep(1); if (pthread_join(thread, NULL) == 0) { printf("pthread wait success\n"); } else { printf("pthread wait failed\n"); } return 0; }点击复制复制失败已复制
编译并运行,结果如下:
$ gcc main.c -lpthread && ./a.out thread... pthread wait failed