[英]How to use std::mutex in different threads?
如何使用互斥體正確編寫多線程代碼:
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 沒有信號量? 如何同步線程?
Mutex 需要由擁有線程(鎖定它的線程)解鎖:
如果互斥鎖當前未被調用線程鎖定,則會導致未定義的行為。 ( http://www.cplusplus.com/reference/mutex/mutex/unlock/ )
您需要使用條件變量 - 我認為圍繞它構建一個信號量實現在您的情況下會很好。 請參閱此處接受的答案: C++0x has no semaphores? 如何同步線程?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.