簡體   English   中英

Linux內核如何確定下一個線程ID

[英]How linux kernel decide the next thread id

我對Linux內核調度有疑問。

我們知道,通常,Linux會維護當前最大的pid。 如果我們要啟動一個新進程,內核將使用最大的ID。 因此,如果我們終止並重新啟動一個新進程,則該進程ID不是連續的。 Linux將使用最大的ID,直到達到極限為止。

但是我的問題是linux如何確定線程ID。 假設進程A和B正在運行。 進程A崩潰,但進程B產生新線程。 進程B將僅重用屬於進程A的舊tid,否則進程B也將使用最大的id作為tid。 哪種情況更常見? 我們有文件嗎?

謝謝。

內核設置進程/線程ID的最大數量,並在垃圾被垃圾回收時簡單地回收標識符。 因此,如果進程B產生了足夠的線程,則假定它已被正確銷毀,它將最終從進程A回收線程ID。

編輯:這是一些可以為您提供更具體答案的鏈接

pid和tid之間的區別https://stackoverflow.com/a/8787888/5768168

“線程和進程ID的值范圍是多少?” 線程和進程ID的值范圍是多少?

“ Linux PID回收” https://stackoverflow.com/a/11323428/5768168

“進程標識符” https://en.wikipedia.org/wiki/Process_identifier#Unix-like

“ Linux內核:進程” https://www.win.tue.nl/~aeb/linux/lk/lk-10.html

聽起來您需要使用傳遞給pthread_create()PTHREAD_CREATE_JOINABLE屬性運行線程,然后在進程中有一個專用於使用pthread_join()pthread_tryjoin()收割線程來等待終止的線程。 不要讓外部進程嘗試對其進行排序,而是讓您的進程在pthread_create()成功之后記錄PID / TID對,並讓收割者線程在檢測到線程終止時刪除該對。

我通常將其與主線程組合在一起,該主線程除了生成線程創建線程和收割者線程外什么都不做,然后等待終止信號並終止線程創建者和收割者。 發出信號時,線程創建器立即停止,當不再有未終止的線程正在運行時,收割器停止,當線程創建器和收割器線程都可以為pthread_join() 'd時,主線程終止。 由於主線程非常簡單,因此不太可能崩潰,這意味着工作線程中的大多數崩潰只是將它們交付給收割者。 如果要絕對確定,則外部進程應該是啟動主進程的進程,然后它可以使用wait()或它的同級組件來監視主進程是否已終止(正常還是崩潰)。

暫無
暫無

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

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