Por que std :: mutex está demorando muito tempo para ser compartilhad
Este código demonstra que o mutex está sendo compartilhado entre dois threads, mas um thread o mantém quase o tempo tod
#include <thread>
#include <mutex>
#include <iostream>
#include <unistd.h>
int main ()
{
std::mutex m;
std::thread t ([&] ()
{
while (true)
{
{
std::lock_guard <std::mutex> thread_lock (m);
sleep (1); // or whatever
}
std::cerr << "#";
std::cerr.flush ();
}
});
while (true)
{
std::lock_guard <std::mutex> main_lock (m);
std::cerr << ".";
std::cerr.flush ();
}
}
Compilado com g ++ 7.3.0 no Ubuntu 18.04 4.15.0-23-generic.
A saída é uma mistura de ambos#
e.
aracteres @, mostrando que o mutex está sendo compartilhado, mas o padrão é surpreendente. Normalmente algo como isto:
.......#####..........................##################......................##
i.e. athread_lock
bloqueia o mutex por ummuit muito tempo. Após vários ou mesmo dezenas de segundos, omain_lock
recebe controle (brevemente), então othread_lock
recupera e mantém por séculos. Ligar parastd::this_thread::yield()
não muda nada.
Por que os dois mutexes não têm a mesma probabilidade de obter o bloqueio e como posso fazer com que o mutex seja compartilhado de maneira equilibrada?