[英]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上的互斥實現)的實現使用相同的機制。
我還不清楚隊列在哪里。 它是在正在運行的進程的地址空間還是在內核中的某個地方?
我的另一個疑問是關於條件變量。 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.