gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:05:12 32 4
gpt4 key购买 nike

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

在C++ Concurrency in Action的sec3.2.4中,有一个例子防止多线程死锁。对于没有这本书的人,在另外,还有一个几乎相似的例子可以引用: http://en.cppreference.com/w/cpp/thread/lock_tag

我遇到的问题是两个代码的代码都出现compiler-errors在 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 被“移动”而不是被复制,尽管也有可能通过复制省略 避免复制。 p>

关于Visual Studio 2012 中的 c++11 std::mutex 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14748717/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com