Когда я разблокировал мьютекс, я ожидал, что планировщик проверяет другие потоки, которые в данный момент пытаются заблокировать этот мьютекс, и затем выполняет один из этих ожидающих потоков.Я написал тестовую программу (см. Код ниже) с двумя потоками, которые пытаются получить один и тот же мьютекс в цикле и выполнить некоторую работу (сон в течение 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;
}