Порядок исполнения ожидающих потоков, заблокированных мьютексом - PullRequest
5 голосов
/ 09 октября 2009

У меня есть мьютекс, который управляет доступом к одному объекту из нескольких потоков. Когда поток завершен, мьютекс разблокируется, чтобы позволить потокам заказа работать с объектом. В Windows с использованием функции WaitForSingleObject существует ли порядок, по которому потоки сигнализируются? Я хочу, чтобы первый поток, который пытается заблокировать мьютекс, теперь может быть заблокирован мьютексом. Это будет очередь FIFO, чтобы передача сигналов заблокированным потокам не была случайной. Должен ли я реализовать свой собственный механизм очередей для достижения этой цели? И если да, какие функции полезны?

Ответы [ 4 ]

6 голосов
/ 09 октября 2009
Сигнализация

FIFO ведет к конвои блокировки . В более новых версиях Win32 API проблема конвоя решается с помощью мьютекса и других примитивов синхронизации явно: несправедливо (т. Е. Без FIFO).

Если более одного потока ожидает мьютекс, ожидающий поток выбран. Не принимайте во-первых, во-первых (FIFO) заказ. Внешние события, такие как APC в режиме ядра могут изменить время ожидания заказ.

0 голосов
/ 14 октября 2009

Способ Windows для составления собственного расписания - использование волокон. Основной поток будет ожидать мьютекса, после его возвращения вы явно вызываете SwitchToFiber из потока, безопасного QUEUE (FIFO).

  1. Поток, вызывающий SwitchToFiber, должен будет вызвать ConvertThreadToFiber
  2. Функция в SwitchToFiber должна вызывать SwitchToFiber из QUEUE
0 голосов
/ 11 октября 2009

Если вы хотите, чтобы разблокировка происходила в порядке FIFO, вы можете использовать пользовательскую блокировку. Блокировка FIFO существует в ACE; он называется ACE_Token, и, поскольку он с открытым исходным кодом, возможно, вы можете использовать его в качестве эталонной реализации. я думаю, что использование его будет минимальным.

0 голосов
/ 09 октября 2009

Да, вам нужно реализовать собственный механизм организации очереди, если вы хотите очередь FIFO.

...