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