3

这是关于 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 中解决这个问题的任何想法?

4

3 回答 3

7

mutexes不可复制或可分配,并且std::thread构造函数正在尝试制作副本。您可以通过使用std::reference_wrappervia来规避此问题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

您正在复制my_accountyour_account复制std::thread,但 std::mutex 既不可复制也不可移动。

尝试通过引用传递:

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

这个参考

互斥锁类是不可复制的。

不能复制或移动互斥锁。

于 2013-02-07T10:26:52.347 回答