1

我读到了 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;
}
4

1 回答 1

2

这里的“资源”仅包括pthreads加入线程并找出其退出状态所需的内部资源。

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

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

  • 您可以加入或分离线程;你不能两者都做。
  • 检查函数的返回码是个好习惯;这里pthread_detach()可能返回错误代码。
  • 目前尚不清楚您希望通过重复实现什么i=*(int *)x。即使readbytes确实被自动释放,第二个i=*(int *)x也只会导致未定义的行为,这可能会或可能不会以任何特定方式表现出来。
于 2013-01-06T09:00:03.423 回答