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?

questionAnswers(2)

yourAnswerToTheQuestion