簡體   English   中英

當多個pthread爭奪互斥鎖時,為什么PTHREAD_MUTEX_ADAPTIVE_NP的行為類似於PTHREAD_MUTEX_TIMED_NP

[英]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.

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