2016-09-02 196 views
3

我正將幾個變量通過指針(cv :: Mat's和bool's)傳遞給幾個線程,並試圖瞭解何時需要它使用互斥體。我發現如果不在cv :: Mat上使用它,我的程序會崩潰(很可能是因爲一個線程正在寫入另一個正在讀取的同一個內存區域),所以我已經爲這些變量實現了互斥鎖,並且它已經解決了這個問題。爲什麼互斥體不需要互斥體(並且該互斥體需要互斥體...)

但現在互斥體是一個更多的變量,我通過指針傳遞給每個線程。因此,在這種情況下,使用互斥變量的處理方式與我需要互斥量的其他變量相同,所以互斥體的特殊之處在於我不需要互斥體(當然,這仍然存在永遠和conept不起作用)。

要清楚,代碼我工作正常,這是更多的教育目的。

實施例:

//Common frames 
cv::Mat captureimage, displayimage; 
std::mutex capturemutex, displaymutex; 

//Start image capture thread 
std::thread t_imagecapture(CaptureImageThread, &captureimage, &capturemutex, &exitsignal); 
//Start image processor thread 
std::thread t_imageprocessor(ProcessImageThread, &captureimage, &capturemutex, &exitsignal); 
//Start display thread 
std::thread t_displayupdate(DisplayUpdateThread, &displayimage, &displaymutex, &exitsignal); 
+3

通常對於線程之間共享的所有變量都有一個互斥量就足夠了。 –

+1

互斥鎖被設計爲自己進行線程安全。他們使用操作系統的底層機制,這可以確保您在鎖定/解鎖互斥鎖時不會遇到競爭狀況。 – Hayt

+3

「我已經爲這些變量實現了互斥體」 - 不,你沒有**實現**互斥體;你已經**使用了**互斥體。 –

回答

4

一個互斥的原子鎖。它使用低級方法(CPU),例如它可以在不中斷的情況下鎖定,所以它不需要外部鎖定來執行此操作。一旦鎖定被設置,其他線程無法做到這一點,因此互斥鎖可以保護其他資源的訪問。

+0

,這是一種可能的實現方式... –

+0

是的,我認爲我需要指出所有的實現。我甚至不知道所有的實現,所以我會編輯以突出顯示。 – stefaanv

+0

謝謝!此外,[this](http://preshing.com/20130618/atomic-vs-non-atomic-operations/)網站對解釋原​​子操作很有幫助。和原子操作的主題一樣,閱讀[this](http://stackoverflow.com/questions/9200951/is-it-ok-to-read-a-shared-boolean-flag-without-locking-it-when-另一個線程馬)線程聽起來像我需要使用std ::原子爲我的布爾變量。 – DrTarr