Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349107
  • 博文数量: 60
  • 博客积分: 1570
  • 博客等级: 上尉
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-02 23:37
文章分类

全部博文(60)

文章存档

2012年(2)

2010年(2)

2009年(56)

分类: LINUX

2009-11-26 18:41:48

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);
}



 


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