3

これは、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でこの問題を解決するためのアイデアはありますか?

4

3 に答える 3

7

mutexesコピー可能または割り当て可能ではなく、std::threadコンストラクターがコピーを作成しようとしています。std::reference_wrapperビアを使用してこれを回避できます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コピーではなく「移動」される可能性が高くなりますが、コピーの省略によってコピーが回避される可能性もあります。

于 2013-02-07T10:27:43.143 に答える
1

std :: threadのコピーを作成していますがmy_accountyour_accountstd ::mutexはコピー可能でも移動可能でもありません。

参照パスを試してください:

 std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
于 2013-02-07T10:28:01.200 に答える
0

このリファレンスから:

mutexクラスはコピーできません。

ミューテックスをコピーまたは移動することはできません。

于 2013-02-07T10:26:52.347 に答える