繁体   English   中英

Visual Studio 2012中的c ++ 11 std :: mutex编译器错误

[英]c++11 std::mutex compiler error in Visual Studio 2012

这是对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::ref使用std::reference_wrapper来避免这种情况:

std::thread t1(transfer, std::ref(my_account), std::ref(your_account));

或者,您可以传递临时bank_accounts

std::thread t1(transfer, bank_account(), bank_account());

这很可能导致bank_accounts被“移动”而不是被复制,尽管也可能通过复制省略来避免复制

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

尝试通过引用传递:

 std::thread t1(transfer, std::ref(my_account), std::ref(your_account));

这个参考

互斥类是不可复制的。

无法复制或移动互斥锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM