这是一个关于 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 中解决这个问题吗?
mutexes
不可复制或分配,并且std::thread
构造函数正在尝试复制。您可以通过使用来规避此问题std::reference_wrapper
via std::ref
:
std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
或者,您可以通过临时bank_accounts
:
std::thread t1(transfer, bank_account(), bank_account());
这很可能会导致bank_accounts
被“移动”而不是被复制,尽管也有可能通过以下方式避免复制复制省略.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)