在下面的代码片段中,如果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();
}
1条答案
按热度按时间ijxebb2r1#
不,互斥体不会被锁定。
std::condition_variable
的各种wait()
方法要求调用它们的执行线程锁定指定的互斥体。否则,这是未定义的行为,根据定义,您不能期望任何特定的结果。