我目前有一個程序一次運行約20個線程。我對多線程相當陌生,所以我對正確的數據保護有點困惑。事件還是互斥?
目前,我的線程使用事件作爲數據鎖定解鎖。我選擇在關鍵部分使用它,因爲大多數數據僅在兩個或三個線程之間共享,因此阻止單個線程讀取,而通過停止所有20個線程寫入時,這看起來很浪費。我只是因爲我無法(很容易地)找到一個明確解釋Mutex如何工作以及如何實現Mutex的源代碼,因此我使用了互斥事件。
我爲我的多線程使用Win32 API。在我當前的設置中,我使用事件來鎖定數據,所以我的事件就像「DataUnlock」。如果沒有設置,我知道數據正在處理。設置時,我知道可以處理數據。所以我的臨時數據鎖看起來像這樣。
WaitForSingleObject(DataUnlock,INFINITE); //Wait until the Data is free
ResetEvent(DataUnlock); //Signal that the data is being worked on
...work on Data...
SetEvent(DataUnlock); //Signal that the data is free to use
我的第一個問題是:當只有兩個線程訪問數據時,這與使用Mutex一樣好嗎(高效)?第二:如果等待訪問數據的兩個以上的線程在釋放數據時會觸發這兩個線程(兩者都會在等待ResetEvent之前通過等待)?如果是這樣,互斥體會有同樣的問題嗎?
最後:如果互斥量更好,我將如何去實現一個(鏈接或解釋將不勝感激)?
謝謝!