C++ c++;Visual Studio 2012中的11 std::互斥编译器错误
这是一个关于C++11标准中死锁的探索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++并发操作的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示例(可能)未经测试。