Синхронизация потоков с использованием условных переменных (мониторов)
Мне нужно синхронизировать несколько потоков (используя потоки POSIX). Более того, я использую условные переменные (мониторы) для достижения этой цели.
Проблема в том, что я должен реализовать стратегию "первым пришел - первым обслужен". Допустим, несколько потоков ожидают, пока другой поток не сообщит об изменении условия, pthread_cond_wait
call помещает потоки в саму очередь, или я должен определить явную очередь для достижения этой цели? Возможным решением этой проблемы также может быть использование замков.
1 ответ
API Pthreads не гарантирует справедливость для pthread_cond_wait
+ pthread_cond_signal
/pthread_cond_broadcast
комбо. В спецификации прямо указывается, что политика планирования будет определять порядок, в котором ожидающие потоки будут активироваться:
Если в условной переменной заблокировано более одного потока, политика планирования должна определять порядок, в котором потоки разблокированы.
Если вы не хотите полагаться на планировщик (даже если он хорошо "состарился", как Linux 'CFS), вам нужно контролировать парковку и самостоятельно парковаться.
Что касается реализации справедливой очереди ожидания, вы можете построить поверх очереди MCS.