2010-01-29 167 views
11

我在寫一個多線程的C++程序。我打算殺死線程。但是,我也使用ref計數的GC。我想知道當一個線程被殺死時,堆棧分配的對象是否會被破壞。當我殺死C++中的pThread時,棧上的對象的析構函數會被調用嗎?

+1

你隨時可以測試..:P – sud03r 2010-01-29 15:54:39

+2

@Neeraj測試並不總是說實話。 – AraK 2010-01-29 15:55:58

+1

確實。實際上測試經常說謊。請記住,在一個編譯器/平臺/機器上工作的可能不適用於另一個。同時請記住,並不總是遵循標準,所以對此類問題的正確答案是:研究與測試。 – Toji 2010-01-29 16:10:32

回答

15

當你'殺死'一個線程時,堆棧並不放鬆。

殺死線程不是一種可靠的操作方式 - 它們打開的資源(如文件)在進程關閉前保持打開狀態。此外,如果他們在關閉鎖時打開任何鎖,則鎖可能會保持鎖定狀態。請記住,您可能會調用很多您無法控制的平臺代碼,並且您無法始終看到這些內容。

關閉一個線程的優雅健壯的方法是中斷它 - 通常它將輪詢以查看它是否被告知定期關閉,或者它正在運行一個消息循環併發送一條退出消息。

1

我懷疑它 - pthread是一個純C api,所以我懷疑它會有任何機制來展開線程的堆棧。

0

這樣做沒有標準化。看起來有些實現有,有些則沒有。

pthread_cancel()真的應該避免,如果可以的話;它不會實際上停止線程,直到它達到取消點,這通常是其他任何pthread_ *調用。特別是,在許多平臺上,取消不會中斷讀取。

0

#include<iostream> 
#include<pthread.h> 

class obj 
{ 
public: 
obj(){printf("constructor called\n");} 
~obj(){printf("destructor called\n");} 
}; 

void *runner(void *param) 
{ 
    printf("In the thread\n"); 
    obj ob; 
    puts("sleep.."); 
    sleep(4); 
    puts("woke up"); 
    pthread_exit(0); 
} 

int main(int argc,char *argv[]) 
{ 
    int i,n; 
    puts("testing pkill"); 
    pthread_attr_t attr; 
    pthread_t tid; 
    //create child thread with default attributes 
    pthread_attr_init(&attr); 
    pthread_create(&tid,&attr,runner,0); 
    pthread_cancel(tid); 
    pthread_join(tid,NULL);//wait till finished 
    //the parent process outputs value 
    return 0; 
} 

雖然不能與上述觀點一致,下面的代碼輸出

 
testing pkill 
In the thread 
constructor called 
sleep.. 
destructor called 
+0

你打斷了睡眠,沒有殺死它 – Will 2010-01-29 16:18:19

相關問題