簡體   English   中英

std :: mutex不能在std :: thread之間共享

[英]std::mutex can't be shared among std::thread

在以下代碼中,我認為子線程無法獲取mLooperMutex。 但是節目輸出非常令人驚訝。 看起來在std :: thread中捕獲的mLooperMutex與主線程中的不同。

但是如果我將std :: thread的detach()調用更改為join(),這將導致死鎖,因為mLooperMutex已被主線程鎖定。

如果我想在不同的線程中使用mLooperMutex,這個程序有什么問題嗎?

a.out:main:等待cond開始
孩子:獲得鎖定開始
孩子:完成鎖定
孩子:通知一個人開始
孩子:通知一個完成
主要:等待cond完成

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

int main()
{
    std::condition_variable looperSet;
    bool child_done = false;
    std::mutex mLooperMutex;

    cout << "main: acquiring lock begin" << endl;
    std::unique_lock<std::mutex> lock(mLooperMutex);
    cout << "main: acquiring lock done" << endl;

    std::thread{[&mutex=mLooperMutex, &looperSet, &child_done] () {
        cout << "child: acquiring lock begin" << endl;
        std::unique_lock<std::mutex> lock(mutex);
        cout << "child: acquiring lock done" << endl;
        child_done = true;
        lock.unlock();

        cout << "child: notify one begin" << endl;
        looperSet.notify_one();
        cout << "child: notify one done" << endl;


    }}.detach();

    cout << "main: wait cond begin" << endl;
    looperSet.wait(lock, [&child_done]{ return child_done; });
    cout << "main: wait cond done" << endl;

    return 0;
}

可以在子線程中獲取mLooperMutex的原因是因為looperSet.wait釋放了looperSet.wait

// This unlocks "lock", and then locks it again afterwards.
looperSet.wait(lock, [&child_done]{ return child_done; });

這與.join()不起作用的原因是因為.join()在繼續之前等待線程完成,並且線程在釋放鎖之前無法完成,並且looperSet.wait()釋放了在.join()完成之前,lock不會運行。

創建一個線程然后立即調用.join()並不是很有用,你也可以直接運行代碼而不是使用線程。

暫無
暫無

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

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