簡體   English   中英

為什么lock_guard可以通過unique_lock獲得已經鎖定的互斥鎖?

[英]why lock_guard can get an already locked mutex by unique_lock?

我讀使用的示例代碼condition_variable 這里 我發布以下代碼:

std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;

void worker_thread()
{
    // Wait until main() sends data
    std::cout << "------------------------\n";
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});

    // after the wait, we own the lock.
    std::cout << "Worker thread is processing data\n";
    data += " after processing";

    // Send data back to main()
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";

    // Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)
    lk.unlock();
    cv.notify_one();
}

int main()
{
    std::thread worker(worker_thread);

    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();

    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in main(), data = " << data << '\n';

    worker.join();

    return 0;
}

我的問題是worker_thread首先啟動,因此我假設互斥鎖mworker_thread鎖定了,但是為什么在main互斥鎖m仍然可以被lock_guard鎖定?

條件變量只是三腳架的一部分。

這三個部分是條件變量,狀態和保護狀態的互斥量。

條件變量提供了一種在狀態更改時發出通知的機制。

此操作使用所有3:

cv.wait(lk, []{return ready;})

條件變量的方法需要一個鎖(必須已獲取)和一個lambda(用於測試狀態)。

wait方法中, lk解鎖,直到條件變量檢測到消息(可能是虛假的)為止。 當檢測到消息時,它將重新鎖定互斥鎖並運行測試(其目的是確定檢測是否虛假的)。 如果測試失敗,它將解鎖並再次等待:如果測試通過,它將保持鎖定並退出。

還有一個“測試拋出”路徑,根據您所實現的代碼的標准版本(C ++ 11有一個缺陷,IIRC),它會導致不同的鎖定狀態。

您錯過的重要一件事是, wait解鎖傳入的互斥量。

暫無
暫無

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

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