2013-03-13 3 views
2

Скажите, если у меня есть три потока, которые имеют доступ к одной и той же взаимоисключающей части через мьютексы.Порядок размещения в очереди Mutex

Позвольте привести этот пример.

Первый поток зондов взаимную блокировку и получает свою долю первого:

//THREAD 1 
//TIME: 2013-03-13 01:00:00.000Z 
WaitForSingleObject(hMutex, INFINITE); 

//Performs the operation that lasts 50 ms 

ReleaseMutex(hMutex); 

Затем 10 мс позже нить 2 также просит его:

//THREAD 2 
//TIME: 2013-03-13 01:00:00.010Z 
WaitForSingleObject(hMutex, INFINITE); 
//Do work 
ReleaseMutex(hMutex); 

и 20 мс позже нить 3 просит ее как скважина:

//THREAD 3 
//TIME: 2013-03-13 01:00:00.030Z 
WaitForSingleObject(hMutex, INFINITE); 
//Do work 
ReleaseMutex(hMutex); 

В этой ситуации я могу быть уверен, что поток 2 всегда будет обладать правами на мьютексы перед потоком 3 (так как он был «первым в очереди», так сказать), или это совершенно произвольно, кто получает право собственности между потоками 2 и 3?

И если это произвольно с мьютексами, как убедиться, что первый поток ожидания получает право собственности?

+4

Нет, вы не можете ожидать логику FIFO от этих объектов. http://stackoverflow.com/questions/10461473/waitforsingleobject-do-threads-waiting-form-a-queue –

ответ

5

Можно с уверенностью сказать, что для вашей цели это произвольно в том смысле, что операционная система пробудит один из потоков, ожидающих Mutex, и предоставит его потоку, но решение о том, детерминированный.

Вы можете реализовать свою собственную схему приоритета между вашими потоками, используя глобальный индекс приоритета. Затем, если один из потоков, ожидающих Mutex, получает его, когда он не является первым в строке, он сразу же отдает его и продолжает ждать, пока Mutex снова станет доступным. Это должно повторяться до тех пор, пока не будет получен Mutex, и поток будет first-in-line в соответствии с индексом приоритета потока по сравнению с глобальным индексом.

2

До Vista и Windows Server 2003 с пакетом обновления 1 (SP1) блокирующие примитивы пытались предложить справедливость (FIFO). Поскольку справедливость приводит к конвоям блокировки, поскольку Vista и Windows Server 2003 SP1 блокирующие примитивы явно несправедливы (без FIFO). См. Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista и связанные статьи.

Смежные вопросы