是否有可能已經有一個互斥鎖的線程檢查另一個線程是否已經在等待,而不釋放互斥鎖?例如,假設一個線程有3個任務在一個數據塊上運行,但另一個線程也可能有一個短的任務來運行數據。理想情況下,我有第一個線程檢查另一個線程是否在三個任務中的每一個之間等待,並允許另一個線程在恢復其他兩個任務之前執行其任務。 Boost是否有一種支持此功能的互斥鎖(假設C++ 11互斥鎖或鎖定類型不支持此功能),還是可以通過條件變量完成?C++互斥鎖 - 檢查另一個線程是否正在等待
回答
您無法檢查其他線程是否正在等待互斥鎖。
如果您想讓其他線程有機會運行,只需釋放互斥鎖即可。無需知道是否有人在等待。然後根據需要重新獲得。
有條件的變量是事件。如果您想要等待,請使用它們,直到出現問題。至檢查無論發生什麼事情,您都需要一個常規(互斥鎖保護或原子)變量。
您無法檢查其他線程是否正在等待互斥鎖。
如果您確實需要這樣的功能,您需要實現自己的功能。 與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。
爲什麼使用'return count> 1?count-1:0;'而不僅僅是'return count'? –
2William Rosenbloom 因爲一個線程當前持有互斥體並做了一些工作,而不是等待互斥體。 – 4LegsDrivenCat
2naive_coach 首先解鎖互斥鎖然後減少計數會更安全一些,但即使在這種情況下,讀者應該明白,應該謹慎使用此示例my_mutex,因爲計數值可能會在您檢查它的點和你採取一些行動的重點。所以它只能用在這個事實並不重要的情況下。 – 4LegsDrivenCat
如果兩個線程正在等待一個鎖,開始等待的線程首先是而不是保證是在線程變得可用時首先獲取它的線程。所以,如果你是一個緊密循環線程誰做類似
while(true):
mutex.lock()
print "got the lock; releasing it"
mutex.unlock()
你可能會認爲你是禮貌的所有其他線程等待鎖,但你不是,系統可能只給你一遍又一遍的鎖,不管其他線程是否跳入其中,無論他們等待多久。
條件變量是解決此問題的合理方法。
- 1. C++等待互斥
- 2. 如何讓一個線程解鎖另一個線程鎖定的互斥鎖?
- 3. 如何在OpenMP上等待互斥鎖
- 4. pthread互斥鎖兩個線程互鎖鎖定/解鎖是否有效?
- 5. 等待另一個線程
- 6. 等待線程被互斥鎖阻塞的執行順序
- 7. 線程是否在鎖FIFO上等待?
- 8. 多線程互斥鎖可以使用多個互斥鎖
- 9. Linux互斥鎖檢查程序是否已經在運行?
- 10. 如何檢查線程是否持有互斥體C++
- 11. 檢查一個並行線程互斥鎖定或解鎖(後一個線程已經鎖定本身)
- 12. 多線程和互斥鎖
- 13. C++多線程互斥鎖問題
- 14. 在Boost進程搜索中,線程停留在互斥鎖中等待managed_shared_memory
- 15. 線程在同一互斥鎖的多個鎖上的行爲
- 16. 這些線程中的每一個都等待,直到互斥鎖被解鎖以執行一個函數?
- 17. pthread_cond_wait不解鎖互斥鎖
- 18. 在使用互斥鎖和等待數據時出現死鎖
- 19. 嘗試鎖互斥鎖或等待,直到解鎖
- 20. ManualResetEvent大小檢查是否足以等待多個線程?
- 21. 線程正在等待另一個線程
- 22. 瞭解互斥鎖類
- 23. 如何等待,直到互斥鎖解鎖?
- 24. 互斥鎖和鎖
- 25. 檢查一個孩子的PID是否正在等待Scanf
- 26. 等待互斥量,條件變量或I/O是否自動產生()線程?
- 27. boost :: mutex /如何測試一個互斥鎖是否被鎖定
- 28. Java中是否存在互斥鎖?
- 29. 如何檢查是否沒有獲取互斥鎖?
- 30. 爪哇等待在另一個線程
這樣的功能通常不會提供,因爲它旁邊沒有用例,任何這樣的信息已經被返回的信息過期了。 –