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

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

本文关键字:mutex 编译器 错误 std c++11 Studio 2012 中的 Visual      更新时间:2023-10-16

这是对C++11标准中死锁的一个探索。

在C++并发操作的第3.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));

来自此引用:

互斥对象类是不可复制的。

互斥对象无法复制或移动。