簡體   English   中英

POSIX線程被“暫停”是什么意思?

[英]What does it mean to POSIX that a thread is “suspended”?

在對最近一個問題的評論過程中,出現了一個附屬問題,即在什么時候可以預期對具有可取消性PTHREAD_CANCEL_DEFERRED的pthreads線程的取消請求采取行動。 隨后提到了標准和一些律師。 我並不太關心我在這個問題的評論中是否錯了,但我確定我正確理解POSIX的規定。

標准中最相關的部分說

每當線程啟用了可取消性並且已經以該線程作為目標取消請求,然后線程調用任何作為取消點的函數時,取消請求將在函數返回之前被執行。 如果線程已啟用可取消性並且在線程作為目標進行取消請求,而線程在取消點處被掛起,則線程應被喚醒並且應取消取消請求。

但是,線程被“暫停”是什么意思呢? POSIX明確定義了進程的術語,但就我所知,對於線程沒有明確定義。 另一方面,POSIX將線程暫停作為少數函數的行為之一,包括但不限於與同步對象相關的一些函數。 是否應該得出結論認為那些集體作為該術語的相關定義?

鑒於POSIX沒有將線程暫停指定為read()fread()或任何常規文件或流I / O函數的行為的一部分,因此這一切都與生成此查詢行的問題有關,如果一個帖子由於在I / O上被阻止而沒有取得進展,這是否意味着它被“暫停”以便取消?

如你所說,掛起的線程在套接字讀取時被阻塞,等待信號量變得可用,等等。

鑒於POSIX實現在棘手的邊緣變化,並且有可能在不是取消點的函數中阻塞線程,可能依賴於要移植的代碼中的取消可能更麻煩比它值得。

我從來沒有使用它,我總是選擇使用代碼來明確地指示線程終止(通常是管道或隊列中的消息)。 使用Communicating Sequential Processes或Actor Model系統非常容易。

這樣清理可以在一個人自己的控制下完成,根據需要釋放內存等。 我不知道取消的線程是否會清理它的內存(我懷疑沒有),或者是否存在at_exit()類型的東西(可能存在)。 總的來說,我認為如果線程只有一種方式可以退出,那么應用程序行為就會得到更徹底的控制。

== ==編輯

@JohnBollinger,

使用的語言If a thread has cancelability enabled and a cancellation request is made with the thread as a target while the thread is suspended at a cancellation point則可被解釋為IF a thread has cancelability enabled AND IF cancelled and IF implementation suspends blocked threads AND IF the thread is blocked THEN the thread shall be awakened... 換句話說,他們將它留給了POSIX子系統的實現者。

Cygwin的select()實現沒有(或者至少沒有)導致線程被掛起。 相反,它會為每個文件描述符生成一個輪詢線程來測試可信任的活動,因為在Windows中基本缺乏像select()這樣的東西(它接近,但沒有雪茄.Win32 select()僅適用於套接字)。 早在20世紀80年代,select()的實現也經常以這種方式工作。

可能出於這樣的原因,POSIX不願意清楚地定義線程何時被掛起。 從歷史上看,select()的許多實現都是這樣的,這使得它成為標准委員會的一個雷區,可以說明線程何時可能被暫停或者可能不會被暫停。 當然,select()引起的復雜性也適用於一個進程,但是由於POSIX確實定義了一個暫停的進程,它們似乎很奇怪它們不能/不會將定義擴展到線程。

它可能取決於如何實現線程; 你可以想象有一個不使用操作系統線程的POSIX實現(有點像在操作系統根本沒有執行線程的時候早期的ADA實現),在這種實現中,被阻塞的線程可能不會被暫停(在沒有CPU周期的意義上)。

在線程的上下文中定義suspend:

3.107條件變量

一個同步對象,允許線程重復暫停執行,直到某個關聯的謂詞變為真。 執行掛起在條件變量上的線程被稱為在條件變量上被阻塞。

來自: http//pubs.opengroup.org/onlinepubs/9699919799/

這不是一個直接的答案,只是一個定義 - 對於評論來說太大了。 被阻止==暫停。

read,fread和friends是系統調用,因此它們將執行上下文切換並從內核上下文執行,直到這些函數完成。 中斷內核上下文超出了pthreads的范圍,因此它們不會導致取消。

我沒有它的參考,但據我所知,在Posix線程的上下文中的線程暫停與它的同步對象(如futex的)有關。

暫無
暫無

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

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