2013-01-06 37 views
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; 
} 

回答

2

這裏的「資源」僅包括需要加入該線程,並找出它的退出狀態的內部pthreads資源。

它不包括你自己獲得的任何其他資源(堆內存,打開文件,數據庫連接,等等)。認識到這些資源通常不具有屬於特定線程的固有概念可能是有幫助的,因爲線程可以自由地共享它們。

有你的代碼的幾個其他問題:

  • 您可以加入一個線程或分離它;你不能這樣做。
  • 檢查函數返回碼是一種很好的做法;這裏pthread_detach()可能會返回一個錯誤代碼。
  • 目前尚不清楚你希望實現與重複i=*(int *)x什麼。即使readbytes確實被自動解除分配,第二個i=*(int *)x只會導致未定義的行爲,這可能會或可能不會以任何特定的方式表現出來。
+0

也'pthread_detach'不釋放資源,它只是標誌着線程沾邊,因此家長不必加入。 – iabdalkader