簡體   English   中英

如何lock_guard <mutex> 構造函數可以在沒有互斥體實例的情況下進行編譯?

[英]How lock_guard<mutex> constructor can be compiled fine without mutex instance?

我現在正在研究C ++ 11中的線程,並且遇到了以下代碼行:

lock_guard<mutex> lg(mutex);

沒有可變的mutex mutex只是類型的名稱。

誰能解釋我上面的代碼行是如何工作的?

為什么編譯器(GCC)不會顯示任何錯誤?

完整的代碼:

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

using namespace std;

void do_something()
{
    lock_guard<mutex> lg(mutex);

    cout << "Working..." << endl;

    this_thread::sleep_for(chrono::milliseconds(3000));
}

int main()
{
    thread thd(do_something);
    thd.join();
}

編譯器認為這是原型函數聲明:

lock_guard<mutex> lg(mutex);

為了清楚起見,編譯器將其解析為名為“ lg”的函數的聲明,該函數將互斥量作為參數並返回lock_guard實例。

#include <mutex>

int main()
{
    using namespace std;
    lock_guard<mutex> lg(mutex);
    return 0;
}

vc12 output : warning C4930 : 'std::lock_guard<std::mutex> lg(std::mutex)' : prototyped function not called(was a variable definition intended ? )

在C ++結構中,類,枚舉和聯合名稱位於它們自己的名稱空間(不是C ++ namespace )中,這使您可以擁有與結構相同名稱的變量。

例如:

struct SomeStruct
{
    // Member...
};

SomeStruct SomeStruct;  // Valid declaration

至於沒有收到錯誤,如果您使用的函數在成員函數中顯示了它,則可能是該類具有名為mutex量的成員變量。

暫無
暫無

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

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