2016-09-24 38 views
2

如何正確編寫多線程代碼使用互斥:如何在不同的線程中使用std :: mutex?

std::mutex m, m2;  

... thread 
m2.lock(); 
if ((++reference) == 1) m.lock(); 
m2.unlock(); 

... differenet thread 
m2.lock(); 
if ((reference--) == 0) m.unlock(); // error here 
m2.unlock(); 

當我打電話m.unlock()的Visual Studio 2012會引發錯誤R6010。 Mutex m2工作正常,因爲它在一個線程中鎖定和解鎖。

我試圖用std :: contidional_variable替換代碼,但是它在啓動時沒有通知,並且首先進入cond_var.wait_one等待無限。

UPD:替換爲conditional_variable,現在一切正常。文章:C++0x has no semaphores? How to synchronize threads?

+0

還有什麼地方在您的程序中鎖定/解鎖互斥鎖。 – v78

+0

在第三個線程中,這個互斥鎖是鎖,做一些工作並解鎖。在這個線程裏面一切都很好。 我評論過它,沒有任何變化(錯誤R6010提出)。 – Alexey

+0

請注意,「reference」增量和減量周圍的括號不是必需的(並且分散注意力)。 –

回答

相關問題