在Visual Studio 2012 C ++ 11的std ::互斥编译器错误(c++11 st

2019-07-19 12:45发布

这是一个关于用C僵局寻求++ 11标准。

在C ++中的并发中行动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这个问题?

Answer 1:

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被“感动”,而不是复制的,虽然它也有可能是副本将通过复制省略避免。



Answer 2:

要制作副本my_accountyour_account到的std ::线程 ,但性病::互斥既不是可复制也不可移动。

尝试通过引用传递:

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


Answer 3:

从这个参考 :

Mutex类是不可复制的。

互斥不能被复制或移动。



文章来源: c++11 std::mutex compiler error in Visual Studio 2012