我在寫一個多線程的C++程序。我打算殺死線程。但是,我也使用ref計數的GC。我想知道當一個線程被殺死時,堆棧分配的對象是否會被破壞。當我殺死C++中的pThread時,棧上的對象的析構函數會被調用嗎?
11
A
回答
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
相關問題
- 1. C++ - 當矢量持有對象時調用析構函數嗎?
- 2. 當一個窗口關閉時,我的析構函數會被調用嗎?
- 3. 調用finish()後活動對象何時真的被殺死?
- 4. C++堆棧分配對象,顯式析構函數調用
- 5. 對象是否會被殺死?
- 6. 可以在另一個對象的析構函數中調用被銷燬的對象的成員函數嗎?
- 7. 函數調用中的堆棧對象何時構建?
- 8. 當父進程被「kill -9」殺死時,子進程是否也會被殺死?
- 9. C++堆棧分配的對象分配和析構函數調用
- 10. dylib析構函數不會被調用
- 11. 調用堆棧上大對象的構造函數
- 12. C++ thread_local析構函數與pthread析構函數
- 13. C++析構函數沒有被調用?
- 14. 當應用程序已被殺死時,避免應用程序嘗試調用碎片的空構造函數
- 15. 析構函數的對象後不會被調用超出範圍
- 16. 保存當活動被殺死所接收的包對象
- 17. C++太多的析構函數調用,所以幾個對象
- 18. boost :: python包裝對象的C++析構函數調用
- 19. 如果對象在構造函數中拋出異常,基類的析構函數會調用嗎?
- 20. 當變量仍然活着時被調用的C++析構函數
- 21. 殺死線程在pthread庫
- 22. gc-lua對象上的析構函數
- 23. 爲什麼我的Knockout映射會殺死我的$ .change函數?
- 24. 爲什麼當我向實例添加實例時,我的類的析構函數會被調用?
- 25. 殺死等待條件變量的pthread
- 26. C# - Timer的實例何時會被殺死?
- 27. 在什麼情況下C++析構函數不會被調用?
- 28. 爲什麼析構函數不會在你要返回的對象上調用?
- 29. 當堆棧中聲明對象時,你能保證析構函數的順序嗎?
- 30. 當在js模塊中定義對象構造函數時,從C調用JS對象構造函數
你隨時可以測試..:P – sud03r 2010-01-29 15:54:39
@Neeraj測試並不總是說實話。 – AraK 2010-01-29 15:55:58
確實。實際上測試經常說謊。請記住,在一個編譯器/平臺/機器上工作的可能不適用於另一個。同時請記住,並不總是遵循標準,所以對此類問題的正確答案是:研究與測試。 – Toji 2010-01-29 16:10:32