Вопрос по multithreading, c++, windows – WaitForSingleObject - потоки, ожидающие, образуют очередь?

7

Если я установлю 3 потока для ожидания освобождения мьютекса, формируют ли они очередь в соответствии с порядком, в котором они ее запросили, или это неопределенное поведение (т. Е. Мы не знаем, какой из них выберет его первым)?

Ваш Ответ

5   ответов
0

только один поток проснется и заблокирует мьютекс. Но порядок не определен.

2

но это не так часто. Особенно, если поток не выполняет ввод-вывод или ввод-вывод, используя порты завершения или синхронно.

Большинство блокировок пользовательского режима Windows (SRWLock, CriticalSection) несправедливы, если вы можете получить их без блокирования, но справедливо, если вам нужно заблокировать ядро. Причина, по которой это делается таким образом, состоит в том, чтобы избежать конвоев блокировки. В момент установления справедливой блокировки каждый получатель должен пройти через планировщик и путь переключения контекста, прежде чем получить блокировку. Никто не может «пропустить вперед» и просто взять замок, потому что они работают. Таким образом, время получения блокировки для последнего потока в очереди увеличивается на время планирования и переключения контекста для каждого предыдущего потока в очереди. Система не восстанавливается из этого состояния до тех пор, пока внешняя нагрузка в основном не будет удалена, поскольку это стабильное состояние.

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

Error: User Rate Limit Exceededplease do not "sign" your posts.Error: User Rate Limit Exceeded
1

что по этому поводу очень разные мнения, и никакой четкой информации нигде нет. В этой теме:http://us.generation-nt.com/answer/are-events-fair-help-38447612.html некоторые люди, кажется, предполагают, что честность событий реализуется с использованием простой очереди fifo, в которой игнорируются приоритеты, в то время как другие говорят, что справедливость не следует предполагать.

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

8

Статья SDK:

If more than one thread is waiting on a mutex, a waiting thread is selected. Do not assume a first-in, first-out (FIFO) order. External events such as kernel-mode APCs can change the wait order.

Подобные события находятся вне вашего контроля. Так что "неопределенное поведение" это подходящий способ описать это.

Error: User Rate Limit Exceeded
1
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Cheetah
Error: User Rate Limit Exceeded

Похожие вопросы