2014-02-12 59 views
1

這是一個使用C++類thread的實驗。條件變量是否爲互斥鎖提供優先級?

初始條件(ICS):

  1. 線程A具有被一個鎖等待條件變量(在互斥)。
  2. 線程B鎖定了互斥鎖。
  3. 線程C沒有做任何事情。

現在線程C調用m.lock()(創建鎖時)。之後,線程B通知條件變量。線程A是否正在等待該互斥鎖上的一個條件變量等待的事實使得它首先鎖定互斥鎖還是線程C的可能性更大或更小?

這裏是我的意思的例子:

#include <condition_variable> 
#include <mutex> 
#include <thread> 

std::condition_variable cv; 
std::mutex m; 

void funcB() 
{ 
    std::unique_lock<std::mutex> B_lk(m); 
    sleep(2); // allow thread C to attempt lock; IC-2 
    cv.notify_one(); 
    B_lk.unlock(); 
} 

void funcC() 
{ 
    sleep(1); // allow thread B to lock; IC-3 
    std::unique_lock<std::mutex> C_lk(m); 
    /* Perform task C */ 
} 

int main (int argc, char* argv[]) // thread A 
{ 
    std::unique_lock<std::mutex> A_lk(m); 
    std::thread threadB(funcB); 
    std::thread threadC(funcC); 
    cv.wait(A_lk); // IC-1 

    /* Perform task A */ 

    /* Clean up and return */ 
} 

我覺得線程A和C(理論上,反正)同樣有可能鎖定線程B後的互斥解鎖,因爲我沒有看到任何提及在C++標準中的優先級。我讀過關於鎖定優先級的許多其他問題,但我找不到解決這個特定問題的任何問題。

回答

1

該標準故意沒有說明允許自由實施。具體而言,C++ 11§30.5.1類condition variable [thread.condition.condvar]狀態:

void notify_one() noexcept; 

效果:如果任何線程被阻塞等待*this,放開那些之一線程。

void notify_all() noexcept; 

效果:解除封鎖被阻塞,等待*this所有線程。

有任何線程(S),簡稱爲「放開一個」或大約偏好/公平/優先級再沒要求「放開所有」。

+0

對,這就是我讀的。解除阻止,但並不一定意味着線程可以鎖定。只是問了這個問題,以確定我沒有失去任何東西。 – Cerran

相關問題