如何在不同的线程中使用std :: mutex?

时间:2016-09-24 09:03:16

标签: c++ multithreading 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?

1 个答案:

答案 0 :(得分:1)

Mutex需要由拥有线程(锁定它的线程)解锁:

  

如果互斥锁当前未被调用线程锁定,则会导致   未定义的行为。 (http://www.cplusplus.com/reference/mutex/mutex/unlock/

你需要使用条件变量 - 我认为在你的情况下构建一个信号量实现会很好。请在此处查看已接受的答案:C++0x has no semaphores? How to synchronize threads?