簡體   English   中英

什么是多線程等待的`pthread_mutex_lock()`喚醒命令?

[英]What is the `pthread_mutex_lock()` wake order with multiple threads waiting?

假設我在調用pthread_mutex_lock()有多個線程阻塞。 當互斥鎖變得可用時,調用pthread_mutex_lock()的第一個線程是否獲得鎖定? 也就是說,是按FIFO順序調用pthread_mutex_lock() 如果不是,那么它們的訂單是什么? 謝謝!

當互斥鎖變得可用時,調用pthread_mutex_lock()的第一個線程是否獲得鎖定?

不會。其中一個等待的線程會獲得一個鎖定,但是哪個獲取它是不確定的。

FIFO訂單?

FIFO互斥體已經是一種模式。 請參閱在pthreads中實現FIFO互斥鎖

FIFO排序是關於可能的最低效的互斥喚醒順序。 只有真正糟糕的實現才會使用它。 最近運行的線程可以在沒有上下文切換的情況下再次運行,並且最近一個線程運行,其更多的數據和代碼將在緩存中變熱。 合理的實現嘗試將互斥鎖提供給最近一次保留它的線程。

考慮兩個執行此操作的線程:

  1. 獲取互斥鎖。
  2. 調整一些數據。
  3. 釋放互斥鎖。
  4. 轉到第1步。

現在想象兩個線程在單核CPU上運行此代碼。 應該清楚的是,FIFO互斥行為會導致每個上下文切換“調整一些數據” - 最糟糕的結果。

當然,合理的實施通常會給予一些公平的點頭。 我們不希望一個線程沒有前進的進展。 但這很難證明FIFO的實施!

“如果調用pthread_mutex_unlock()時互斥引用的互斥對象上存在線程阻塞,導致互斥鎖變為可用,則調度策略將確定哪個線程將獲取互斥鎖。”

除此之外,POSIX標准沒有規定您的問題的答案。 根據實現所做的選擇,它可以是隨機的,或者可以是FIFO或LIFO或任何其他順序。

暫無
暫無

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

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