Por que não há função de espera para a variável de condição, que não trava novamente o mutex
Considere o seguinte exemplo.
std::mutex mtx;
std::condition_variable cv;
void f()
{
{
std::unique_lock<std::mutex> lock( mtx );
cv.wait( lock ); // 1
}
std::cout << "f()\n";
}
void g()
{
std::this_thread::sleep_for( 1s );
cv.notify_one();
}
int main()
{
std::thread t1{ f };
std::thread t2{ g };
t2.join();
t1.join();
}
g()
"Sabe dissof()
está esperando no cenário que eu gostaria de discutir. De acordo comcppreference.com não há necessidade deg()
bloquear o mutex antes de chamarnotify_one
. Agora na linha marcada "1"cv
libera o mutex e o bloqueia novamente assim que a notificação é enviada. O destruidor delock
lança novamente imediatamente depois disso. Isso parece supérfluo, especialmente porque o bloqueio é caro. (Eu sei que em certos cenários o mutex precisa ser bloqueado. Mas este não é o caso aqui.)
Porquecondition_variable
não tem função "wait_nolock
"que não reinicia o mutex assim que a notificação chega. Se a resposta é que os pthreads não fornecem essa funcionalidade: Por que os pthreads não podem ser estendidos para fornecê-lo? Existe uma alternativa para realizar o comportamento desejado?