簡體   English   中英

線程的等待隊列在哪里位於POSIX pthread互斥鎖並解鎖?

[英]Where does the wait queue for threads lies in POSIX pthread mutex lock and unlock?

我正在瀏覽REMZI的並發部分,並在瀏覽互斥部分時,我對此感到困惑:

為了避免繁忙等待,互斥實現采用了park() / unpark()機制(在Sun OS上),它將一個等待線程放入一個帶有線程ID的隊列中。 稍后在pthread_mutex_unlock()期間,它會從隊列中刪除一個線程,以便調度程序可以選擇它。 類似地,Futex(Linux上的互斥實現)的實現使用相同的機制。

  1. 我還不清楚隊列在哪里。 它是在正在運行的進程的地址空間還是在內核中的某個地方?

  2. 我的另一個疑問是關於條件變量。 pthread_cond_wait()pthread_cond_signal()使用正常信號和等待方法,還是使用它的一些變體?

疑問1:但是,我還不清楚隊列究竟在哪里。 它是在正在運行的進程的地址空間還是在內核中的某個地方。

每個互斥鎖都有一個在內核地址空間中維護的相關數據結構,在Linux中它是futex 該數據結構具有關聯的等待隊列,其中來自不同進程的線程可以排隊並等待喚醒,請參閱futex_wait內核函數

疑問2:我遇到的另一個疑問是關於條件變量,pthread_cond_wait()和pthread_cond_signal()是否使用正常信號和等待方法或者它們使用了它的一些變體。

現代Linux不使用信號進行條件變量信令。 有關更多詳細信息,請參閱NPTL:Linux的新線程實現

將快速用戶空間鎖定(futex)添加到內核中可以完全重新實現互斥鎖和其他同步機制, 而無需借助於線程間信令 反過來,通過向內核引入搶占式調度,使futex成為可能。

暫無
暫無

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

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