これは、C++11標準でのデッドロックに関するクエストです。
C ++ Concurrency in Actionのsec3.2.4には、マルチスレッドのデッドロックを防ぐための例があります。さらに、この本を持っていない人のために、あなたが参照できる別のほぼ同様の例があります:http: //en.cppreference.com/w/cpp/thread/lock_tag
私が遭遇した問題は、両方のコードのコードがVisualStudio2012でコンパイラエラーを発生させることです。エラーメッセージは次のとおりです。
'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でこの問題を解決するためのアイデアはありますか?