全部博文(930)
分类: LINUX
2010-04-15 11:59:02
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;
1. pthread_detach 函数
在默认情况下,线程的终止状态会保存到的对该线程调用 pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被回收。当线程被分离时,并不能用 pthread_join 函数等待它的终止状态。对分离状态的线程进行 pthread_join 调用会产生失败,返回 EINVAL。
调用 pthread_detach 函数可以用于使现有的某个线程进入分离状态,从而让系统在线程退出时回收它所占用的资源。
#include
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
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
#include
#include
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);
}
zhangjiakouzf2011-07-25 12:14:15
那为什么pthread_detach一般会要求放在执行线程中,如果和pthread_create放在一个线程中有可能会segmentation fault啊