这是对C 11标准中的死锁的追求.
在C Concurrency in Action的sec3.2.4中,有一个例子
防止多线程死锁.对于没有这本书的人来说
此外,还有另一个几乎类似的例子,你可以参考:
http://en.cppreference.com/w/cpp/thread/lock_tag
我遇到的问题是两个代码的代码都出现编译器错误
在Visual Studio 2012中.错误消息是:
'std::mutex::mutex': cannot access private member declared in class 'std::mutex'
在以下比cppreference.com更简单的代码中也会出现此问题:
struct bank_account {
std::mutex m;
};
void transfer(bank_account &from, bank_account &to)
{
std::lock(from.m, to.m);
}
int _tmain(int argc, _TCHAR* argv[])
{
bank_account my_account;
bank_account your_account;
std::thread t1(transfer, my_account, your_account); // compiler-error!
std::system("pause");
return 0;
}
有什么想法在Visual Studio 2012中解决这个问题?
解决方法:
互斥锁不可复制或可分配,并且std :: thread构造函数正在尝试复制.您可以通过std :: ref使用std :: reference_wrapper来避免这种情况:
std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
或者,您可以传递临时bank_accounts:
std::thread t1(transfer, bank_account(), bank_account());
这很可能导致bank_accounts被“移动”而不是被复制,尽管也可能通过复制省略来避免复制.