簡體   English   中英

該進程是否會在退出時自動清理pthreads所占用的資源

[英]Does the process automatically clean up the resources taken by pthreads upon exit

假設我有一個像這樣的代碼:

void *my_thread(void *data)
{
    while (1) { }
}

void foo_init(struct my_resource *res)
{
    pthread_create(&res->tid, NULL, my_thread, res);

    /* Some init code */
}

void foo_exit(void)
{
    /* Some exit code */
}

場景就是這樣的。 當進程初始化時,函數foo_init()被調用一個指向我分配的資源的指針(分配由一些其他函數自動完成,這不受我的控制)。 在函數中我正在創建一個在無限循環中運行的pthread

在進程即將終止之后,調用函數foo_exit() ,但這次沒有指向我的資源的指針,因此我無法調用pthread_join() ,因為我的tid包含在my_resource結構中。

現在我的問題是,操作系統終止進程是否會破壞與pthreads有關的資源? 如果是,我怎么能確定。

在不調用pthread_join()情況下終止進程也是安全的嗎?

提前致謝。

如果你在談論分配的內存,是的。 當進程退出所有分配給該進程的虛擬內存頁面時,會返回到系統,這將清除進程中分配的所有內存。

通常,OS應該在退出時清理與進程關聯的所有資源。 它將處理關閉文件句柄(可以包括套接字和RPC機制),擦除堆棧,以及清理任務的內核資源。

簡而言之,如果操作系統在進程后沒有清理它是操作系統中的錯誤。 但我們都沒有寫錯誤的軟件嗎?

當進程終止時(例如,內存,套接字,文件句柄),操作系統會自動釋放進程所需的所有“常規”資源。 最重要的例外是共享內存,但如果它們不是由操作系統管理而是由其他進程管理,則其他資源也可能存在問題。

例如,如果您的進程與守護進程或窗口管理器之類的另一個進程進行通信並分配資源,那么在進程終止而不釋放它們的情況下是否釋放這些進程取決於實現。

我認為問題可以用另一種方式回答:pthreads不擁有任何資源,資源由流程擁有。 (pthread可能是資源的“保管人”,例如它具有malloc的內存,但它不是所有者。)當進程終止時,任何仍然運行的pthreads突然停止,然后通常的進程清理發生。

POSIX說(對於_Exit() ):

•通過調用_Exit()或_exit()終止的線程不應調用其取消清除處理程序或每線程數據析構函數。

對於exit() POSIX指定更多清理 - 特別是運行所有atexit()事物和刷新流等 - 在繼續之前,就像_Exit() 請注意,這不會為任何pthread調用任何pthread取消清理 - 系統無法分辨任何pthread所處的狀態,並且無法確定是否能夠pthread_cancel()所有pthread,所以它唯一能做的就是是阻止他們全都死了。

我可以推薦SingleUNIX®規范(POSIX) - 就像任何標准一樣,它不是一個簡單的閱讀,但值得了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM