簡體   English   中英

Visual Studio 2012中的c ++ 11 std :: mutex編譯器錯誤

[英]c++11 std::mutex compiler error in Visual Studio 2012

這是對C ++ 11標准中的死鎖的追求。

在C ++ Concurrency in Action的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中解決這個問題?

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_accountyour_account復制到std :: thread ,但std :: mutex既不可復制也不可移動。

嘗試通過引用傳遞:

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

這個參考

互斥類是不可復制的。

無法復制或移動互斥鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM