释放线程获取的资源

时间:2013-01-06 08:57:15

标签: c pthreads posix

我读到pthread_detach它在调用时释放了线程获取的资源,所以我做了一个小实验,但即使在分离线程后,看起来资源也没有被释放。这是代码:

#define SIZE 2048
void *func(void *arg);

int main()
{
    void *x;
    int i;

    pthread_t tid;
    pthread_attr_t attr,attr2;


    int fp=open("SharedMemWithMutex.c",O_RDONLY);


    pthread_attr_init(&attr2);

    pthread_create(&tid,&attr2,func,&fp);

    pthread_join(tid,&x); 

    i=*(int *)x;
    fprintf(stderr,"BEFORE DETACH: read bytes are %d\n",i);
    pthread_detach(tid);

    i=*(int *)x;
    fprintf(stderr,"AFTER DETACH: read bytes are %d\n",i);

    return 0;

}

void *func(void *arg)
{
    int fp=*(int *)arg;

    char buf[SIZE];

    int *readbytes=(int *) malloc(sizeof(int));
    *readbytes=read(fp,buf,SIZE);   

    return readbytes;
}

1 个答案:

答案 0 :(得分:2)

此处“资源”仅包含加入线程并查找其退出状态所需的内部pthreads资源。

它不包括您自己获得的任何其他资源(堆内存,打开文件,数据库连接等)。认识到这些资源通常不具有属于特定线程的内在概念可能会有所帮助,因为线程可以自由地共享它们。

您的代码还有其他几个问题:

  • 你可以加入一个帖子或分开它;你不能两者兼顾。
  • 优良作法是检查函数的返回码;这里pthread_detach()可能会返回错误代码。
  • 目前尚不清楚您希望通过重复i=*(int *)x实现什么目标。即使readbytes确实被自动解除分配,第二个i=*(int *)x也会导致未定义的行为,这可能会或可能不会以任何特定的方式表现出来。