c++ 如果在std::condition_variable::wait方法之前没有锁定mutex,mutex会自动锁定吗?

z0qdvdin  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(186)

在下面的代码片段中,如果mutex在'cv.等等,会自动锁上吗?我得到一些奇怪的行为。这两个部分相互连接。

part1

{
    std::mutex& mtx = CoordPlaybackMediator::GetMutex();
    std::unique_lock<std::mutex> uniqueLock(mtx);
    CoordPlaybackMediator::SetPlayBackReadyFlag(true);
    uniqueLock.unlock(); 
    CoordPlaybackMediator::GetCV().notify_one();
    std::condition_variable& cv = CoordPlaybackMediator::GetCV();
    cv.wait(uniqueLock, []()->bool {return CoordPlaybackMediator::GetCoordReadyFlag(); }); 
    CoordPlaybackMediator::ResetCoorAndPlayBackFlags();
    uniqueLock.unlock();

    for (short int i = 0; i < WaveOutBufferThread::NUM_THREAD; ++i)
    {
        this->poWaveOutBufferThreadArray[i]->Play(i);
    }
}

第二部分

{
    std::mutex& mtx = CoordPlaybackMediator::GetMutex();
    std::unique_lock<std::mutex> uniqueLock(mtx);
    CoordPlaybackMediator::GetCV().wait(uniqueLock, []()->bool {return CoordPlaybackMediator::GetPlayBackReadyFlag(); });
    uniqueLock.unlock();

    for (size_t i = 0, counter = 0; i < this->pFileThreadInstance->GetCurrentWaveFileSize(); i += StepSize, counter += 1)
    {
        Debug::out("chunk%d : %2d \n", counter, i);     
    }
    
    this->status = STATUS::EMPTY; 
    std::unique_lock<std::mutex> uniqueLock2(CoordPlaybackMediator::GetMutex());
    CoordPlaybackMediator::SetCoordReadyFlag(true);
    uniqueLock2.unlock();
    CoordPlaybackMediator::GetCV().notify_one();
}
ijxebb2r

ijxebb2r1#

不,互斥体不会被锁定。
std::condition_variable的各种wait()方法要求调用它们的执行线程锁定指定的互斥体。否则,这是未定义的行为,根据定义,您不能期望任何特定的结果。

相关问题