Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;Visual Studio 2012中的11 std::互斥编译器错误_C++_Multithreading_C++11_Locking_Mutex - Fatal编程技术网

C++ c++;Visual Studio 2012中的11 std::互斥编译器错误

C++ c++;Visual Studio 2012中的11 std::互斥编译器错误,c++,multithreading,c++11,locking,mutex,C++,Multithreading,C++11,Locking,Mutex,这是一个关于C++11标准中死锁的探索 在C++并发操作的SEC3.2.4中,有一个例子 防止多线程死锁。对于没有这本书的人,在 此外,您还可以参考另一个几乎类似的示例: 我遇到的问题是,这两种代码的代码都会出现编译器错误 在Visual Studio 2012中。错误消息是: 'std::mutex::mutex': cannot access private member declared in class 'std::mutex' 与cppreference.com相比,以下代码更简单

这是一个关于C++11标准中死锁的探索

在C++并发操作的SEC3.2.4中,有一个例子 防止多线程死锁。对于没有这本书的人,在 此外,您还可以参考另一个几乎类似的示例:

我遇到的问题是,这两种代码的代码都会出现编译器错误 在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中解决此问题?

来源:

互斥类是不可复制的


无法复制或移动互斥体。

互斥体
不可复制或分配,并且
std::thread
构造函数正在尝试复制。您可以通过
std::ref
使用
std::ref
reference\u包装来规避此问题:

std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
或者,您可以传递临时
银行账户

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

这很可能会导致银行账户被“移动”而不是被复制,尽管也可能通过删除副本来避免复制。

您正在将
我的账户
您的账户
复制到,但std::mutex既不可复制也不可移动

尝试通过引用传递:

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

我明白了,它起作用了!非常感谢,也感谢约阿希姆和比尔兹!在“临时银行账户”之间转账有什么用我打赌一个账户也不可复制,否则每个人都会很富有。@BoPersson现在,所有的银行都是临时的,所以我认为其中包含的账户也是临时的:-)我还听说很多钱可以在临时账户之间转账。这是否意味着Cppreference.com上出现了一个罕见的错误示例代码?@SChepurin你是对的,这个例子有一个错误。我刚刚修复了它。这个示例代码中的另一个错误是没有模板实例化的std::lock\u-guard声明,即std::lock\u-guard。@juanchopanza-这很快,我想是正确的修复)。@juanchopanza-现在它可以工作了。我还注意到,由于编译器不符合最新标准,一些没有“输出”字段的Cppreference.com示例(可能)未经测试。