¿Por qué std :: mutex tarda una cantidad de tiempo larga y muy irregular en compartirse?

Este código demuestra que el mutex se comparte entre dos subprocesos, pero un subproceso lo tiene casi todo el tiempo.

#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 con g ++ 7.3.0 en Ubuntu 18.04 4.15.0-23-generic.

La salida es una mezcla de ambos# y. caracteres, que muestran que se comparte el mutex, pero el patrón es sorprendente. Típicamente algo como esto:

.......#####..........................##################......................##

es decir. elthread_lock bloquea el mutex para unamu largo tiempo. Después de varias o incluso decenas de segundos, lamain_lock recibe el control (brevemente) luego elthread_lock lo recupera y lo guarda por años. Llamando astd::this_thread::yield() no cambia nada.

¿Por qué las dos mutexes no tienen la misma probabilidad de ganar el bloqueo, y cómo puedo hacer que la mutex se comparta de manera equilibrada?

Respuestas a la pregunta(2)

Su respuesta a la pregunta