Синхронизация потоков с использованием условных переменных (мониторов)

Мне нужно синхронизировать несколько потоков (используя потоки POSIX). Более того, я использую условные переменные (мониторы) для достижения этой цели.

Проблема в том, что я должен реализовать стратегию "первым пришел - первым обслужен". Допустим, несколько потоков ожидают, пока другой поток не сообщит об изменении условия, pthread_cond_wait call помещает потоки в саму очередь, или я должен определить явную очередь для достижения этой цели? Возможным решением этой проблемы также может быть использование замков.

1 ответ

API Pthreads не гарантирует справедливость для pthread_cond_wait + pthread_cond_signal/pthread_cond_broadcast комбо. В спецификации прямо указывается, что политика планирования будет определять порядок, в котором ожидающие потоки будут активироваться:

Если в условной переменной заблокировано более одного потока, политика планирования должна определять порядок, в котором потоки разблокированы.

Если вы не хотите полагаться на планировщик (даже если он хорошо "состарился", как Linux 'CFS), вам нужно контролировать парковку и самостоятельно парковаться.

Что касается реализации справедливой очереди ожидания, вы можете построить поверх очереди MCS.

Другие вопросы по тегам