Вы можете расширить это (при увеличении стоимости), чтобы оно было справедливым в n-смысле (или даже омега-справедливым), где, если ожидается до N элементов, они все получат свой ход, прежде чем освобождающий поток получит еще один шанс.

код демонстрирует, что мьютекс распределяется между двумя потоками, но один поток имеет его почти все время.

#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 ();
    }
}

Скомпилировано с g ++ 7.3.0 на Ubuntu 18.04 4.15.0-23-generic.

Выход представляет собой смесь обоих# а также. символы, показывающие, что мьютекс является общим, но шаблон удивителен. Как правило, что-то вроде этого:

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

то естьthread_lock блокирует мьютекс дляочень много времени. Через несколько или даже десятки секундmain_lock получает контроль (кратко), тоthread_lock возвращает его и хранит его целую вечность. призваниеstd::this_thread::yield() ничего не меняет

Почему два мьютекса не могут одинаково получить блокировку, и как я могу сделать мьютекс сбалансированным?

Ответы на вопрос(2)

Ваш ответ на вопрос