Планирование потоков при снятии блокировки - PullRequest
0 голосов
/ 22 ноября 2018

Когда я разблокировал мьютекс, я ожидал, что планировщик проверяет другие потоки, которые в данный момент пытаются заблокировать этот мьютекс, и затем выполняет один из этих ожидающих потоков.Я написал тестовую программу (см. Код ниже) с двумя потоками, которые пытаются получить один и тот же мьютекс в цикле и выполнить некоторую работу (сон в течение 1 мс).Разница в том, что один поток t1 ждет короткое время между разблокировкой и попыткой повторно получить мьютекс, а другой поток t2 - нет.Я ожидал, что оба потока получают мьютекс примерно одинаковое количество раз.Тем не менее, в Windows t1 часто получает мьютекс только один раз, а другой поток сотни раз.В Linux поведение отличается, и оба потока работают с t2 примерно вдвое.Почему t1 в Windows почти никогда не получает мьютекс?Как мне изменить код, чтобы он это сделал?

Пример кода:

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>

using namespace std;

int main()
{
    mutex m;
    atomic<bool> go(false);
    int t1Counter = 0, t2Counter = 0;

    thread t1([&] {
        while(!go);
        while(go) {
            this_thread::sleep_for(100us);
            lock_guard<mutex> lg(m);
            this_thread::sleep_for(1ms);
            ++t1Counter;
        }
    });
    thread t2([&] {
        while(!go);
        while(go) {
            lock_guard<mutex> lg(m);
            this_thread::sleep_for(1ms);
            ++t2Counter;
        }
    });

    go = true;
    this_thread::sleep_for(1s);
    go = false;
    t1.join();
    t2.join();

    cout << t1Counter << " " << t2Counter << endl;
}

1 Ответ

0 голосов
/ 22 ноября 2018

В Windows std::mutex реализован с использованием тонкой блокировки чтения / записи.Эта реализация блокировки не справедлива (это означает, что она не дает никаких гарантий относительно порядка, в котором ожидающие потоки получат блокировку).Некоторое время назад Windows отошла от справедливых блокировок, поскольку Microsoft посчитала, что блокировка вызывает более серьезную проблему, чем голодание потоков.

Подробнее о блокировках slim reader / writer можно узнать в документации Microsoft: Slim Reader / Writer (SRW) Блокировки

Джо Даффи также писал в блоге о проблеме справедливости в сравнении с конвоем блокировки: Антиконвойные блокировки в Windows Server 2003 SP1 и Windows Vista

...