Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826087
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: 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);
}
 

阅读(2994) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zhangjiakouzf2011-07-25 12:14:15

那为什么pthread_detach一般会要求放在执行线程中,如果和pthread_create放在一个线程中有可能会segmentation fault啊