Visual Studio 2012中的c++11 std::mutex编译器错误
c++11 std::mutex compiler error in Visual Studio 2012
这是对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_account
和your_account
复制到std::thread,但std::mutex既不可复制也不可移动。
尝试通过参考:
std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
来自此引用:
互斥对象类是不可复制的。
互斥对象无法复制或移动。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 实例化std::mutex时发生编译器错误
- Visual Studio 2012中的c++11 std::mutex编译器错误