1. pthread_detach 函数
在默认情况下,线程的终止状态会保存到的对该线程调用 pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被回收。当线程被分离时,并不能用 pthread_join 函数等待它的终止状态。对分离状态的线程进行 pthread_join 调用会产生失败,返回 EINVAL。
调用 pthread_detach 函数可以用于使现有的某个线程进入分离状态,从而让系统在线程退出时回收它所占用的资源。
#include <pthread.h> int pthread_detach(pthread_t tid); Returns: 0 if OK, error number on failure
|
2. 通过 pthread_attr_setdetachstate 函数设置PTHREAD_CREATE_DETACHED。
如果在创建线程时就知道不需要了解线程的终止状态,则可以修改pthread_attr_t 结构中的 detachstate 线程属性,让线程以分离状态启动。可以使用 pthread_attr_setdetachstate 函数把线程属性 detachstate 设置为下面的两个合法值之一:设置为 PTHREAD_CREATE_DETACHED, 以分离状态启动线程;或者设置为 PTHREAD_CREATE_JOINABLE,以正常启动线程,应用程序可以获取线程的终止状态。
#include <pthread.h>
int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); Both return: 0 if OK, error number on failure
|
可以调用pthread_attr_getdetachstate 函数获取当前的 detachstate 线程属性,第二个参数所指向的整数也许被设置为 PTHREAD_CREATE_DETACHED,也可能设置为PTHREAD_CREATE_JOINABLE,具体要取决于给定 pthread_attr_t 结构中的属性值。
创建一个分离状态的线程 示例代码:
#include <stdio.h> #include <stdlib.h> #include <pthread.h>
int pthread_create_detached(pthread_t *thread, void *(*start_routine)(void *), void *arg) { int err; pthread_attr_t attr;
if (err = pthread_attr_init(&attr) != 0) return err; err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (err == 0) pthread_create(thread, &attr, start_routine, arg); pthread_attr_destroy(&attr); return err; }
/* 测试函数 */ void *func(void *arg) { while (1) { printf("do func() in the new thread...\n"); sleep(3); } }
/* 测试pthread_create_detached 函数的使用 */ int main(int argc, char *argv[]) { printf("starting main...\n"); pthread_t tid;
pthread_create_detached(&tid, func, NULL);
printf("sleep 100 in main...\n"); sleep(100);
exit(0); }
|
阅读(2294) | 评论(0) | 转发(0) |