This a quest about deadlock in C++11 standard.
In the sec3.2.4 of C++ Concurrency in Action, there is an example for preventing multithreads from deadlock. For guys without this book, in addition, there is an another almost similar example you can refer to: http://en.cppreference.com/w/cpp/thread/lock_tag
The problem I encountered is that the codes of both codes arise compiler-errors in Visual Studio 2012. The error message is:
'std::mutex::mutex': cannot access private member declared in class 'std::mutex'
This problem also happens in the following simpler code than in 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;
}
Any idea to solve this problem in Visual Studio 2012?
mutexes
are not copyable or assignable, and thestd::thread
constructor is attempting to make a copy. You can circumvent this by using anstd::reference_wrapper
viastd::ref
:alternatively, you can pass temporary
bank_accounts
:This will most likely result in the
bank_accounts
being "moved" rather than copied, although it is also possible that the copy will be avoided via copy elision.From this reference:
A mutex can't be copied or moved.
You are making copy of
my_account
andyour_account
to std::thread, but std::mutex is neither copyable nor movable.Try pass by reference: