[英]why PTHREAD_MUTEX_ADAPTIVE_NP behaves like PTHREAD_MUTEX_TIMED_NP when more than one pthreads compete for the mutex lock
程序創建一個PTHREAD_MUTEX_ADAPTIVE_NP互斥鎖,現在線程A獲得了鎖。 當線程A給出鎖時,三個線程(B,C,D)爭奪該鎖。 我想知道的是,為什么等待時間最長的線程總是總是先獲得此鎖,然后才獲得第二長時間的線程...等等。
我認為PTHREAD_MUTEX_ADAPTIVE_NP就像pthread_spinlock一樣,就像Kaz Sir在“ 什么是PTHREAD_MUTEX_ADAPTIVE_NP”中的回答:在公平很重要的情況下該方法也不適用:這是一種機會鎖定。
像這樣的代碼
`Thread A:
main() {
mutex_lock;
pthread_create(B);
pthread_create(C);
pthread_create(D);
sleep(3);
mutex_unlock;
}`
Thread B() {
sleep(2);
mutex_lock;
printf("Thread B");
mutex_unlock;
}
Thread C() {
sleep(1);
mutex_lock;
printf("Thread C");
mutex_unlock;
}
Thread D() {
mutex_lock;
printf("Thread D");
mutex_unlock;
}
跟蹤始終是第一個“線程D”->第二個“線程C”->最后一個“線程B”
睡眠會導致ADAPTIVE互斥體變為TIMED互斥體?
您的基本想法是正確的。 但是,自適應互斥鎖僅在很短的時間內忙碌旋轉(最多有100個PAUSE指令調用的循環)。 一旦進入內核睡眠階段,它就會再次像常規互斥鎖一樣工作。
這是因為自適應互斥鎖適用於非常短,競爭激烈的鎖定部分,因此100圈旋轉很有可能導致鎖定可用。
因此,考慮到您的第二次長時間睡眠調用,您所有的鎖都在內核中睡眠,而busyspin邏輯無關緊要。
您可以在此處為pthread_mutex_lock.c查找自適應互斥鎖的實現。 萬一忙碌的紡紗無法獲得鎖,nptl會退回到futex鎖,我認為這至少是確定性的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.