2014-01-16 34 views
0

是否有可能已經有一個互斥鎖的線程檢查另一個線程是否已經在等待,而不釋放互斥鎖?例如,假設一個線程有3個任務在一個數據塊上運行,但另一個線程也可能有一個短的任務來運行數據。理想情況下,我有第一個線程檢查另一個線程是否在三個任務中的每一個之間等待,並允許另一個線程在恢復其他兩個任務之前執行其任務。 Boost是否有一種支持此功能的互斥鎖(假設C++ 11互斥鎖或鎖定類型不支持此功能),還是可以通過條件變量完成?C++互斥鎖 - 檢查另一個線程是否正在等待

+0

這樣的功能通常不會提供,因爲它旁邊沒有用例,任何這樣的信息已經被返回的信息過期了。 –

回答

2

您無法檢查其他線程是否正在等待互斥鎖。

如果您想讓其他線程有機會運行,只需釋放互斥鎖即可。無需知道是否有人在等待。然後根據需要重新獲得。

有條件的變量是事件。如果您想要等待,請使用它們,直到出現問題。至檢查無論發生什麼事情,您都需要一個常規(互斥鎖保護或原子)變量。

1

您無法檢查其他線程是否正在等待互斥鎖。

如果您確實需要這樣的功能,您需要實現自己的功能。 與use_count互斥將足以滿足您的需求。

class my_mutex{ 
public: 
    my_mutex() {count=0;} 
    void lock() {count++; mtx.lock();} 
    void unlock() {count--; mtx.unlock();} 
    size_t get_waiting_threads() {return count>1?count-1:0;} 
private: 
    atomic_ulong count; 
    mutex mtx; 
}; 

如果您需要在執行任務3之前完成任務1和2,則應該使用conditional_variable而不是mutex。

+0

爲什麼使用'return count> 1?count-1:0;'而不僅僅是'return count'? –

+0

2William Rosenbloom 因爲一個線程當前持有互斥體並做了一些工作,而不是等待互斥體。 – 4LegsDrivenCat

+0

2naive_coach 首先解鎖互斥鎖然後減少計數會更安全一些,但即使在這種情況下,讀者應該明白,應該謹慎使用此示例my_mutex,因爲計數值可能會在您檢查它的點和你採取一些行動的重點。所以它只能用在這個事實並不重要的情況下。 – 4LegsDrivenCat

0

如果兩個線程正在等待一個鎖,開始等待的線程首先是而不是保證是在線程變得可用時首先獲取它的線程。所以,如果你是一個緊密循環線程誰做類似

while(true): 
    mutex.lock() 
    print "got the lock; releasing it" 
    mutex.unlock() 

你可能會認爲你是禮貌的所有其他線程等待鎖,但你不是,系統可能只給你一遍又一遍的鎖,不管其他線程是否跳入其中,無論他們等待多久。

條件變量是解決此問題的合理方法。

相關問題