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

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

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

4

Решение

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]