Критическая секция

я не уверен в чем-то.

когда я использую критическую_секцию/мьютекс/семафор в С++, например, как предотвращается проблема busy_wait?

я имею в виду, что когда поток достигает критической секции, а критическая секция занята другим потоком, что мешает потоку тратить время цикла и ничего не ждать?

например, должен ли я вызвать TryEnterCriticalSection и проверить, получил ли поток право собственности, и в противном случае вызвать sleep(0)?

я немного озадачен

Благодарность


person Idan    schedule 20.11.2009    source источник


Ответы (3)


Это специфично для Windows, но Linux будет аналогичным.

В Windows есть концепция готовой очереди потоков. Это потоки, которые готовы к запуску и будут запущены в какой-то момент на доступном процессоре. Какие потоки выбираются для немедленного запуска, немного сложно — потоки могут иметь разные приоритеты, их приоритеты могут быть временно повышены и т. д.

Когда поток ожидает в примитиве синхронизации, таком как CRITICAL_SECTION или мьютекс, он не помещается в очередь готовности — Windows даже не будет пытаться запустить поток и, если возможно, запустит другие потоки. В какой-то момент поток будет перемещен обратно в очередь готовности, например, когда поток, владеющий CS или мьютексом, освободит его.

person Michael    schedule 20.11.2009
comment
хорошо, но это верно, когда EnterCriticalSection ждет бесконечное время для освобождения критической секции. что произойдет, если я установлю ограничение по времени в 5 секунд, функция должна вернуться через 5 секунд. поэтому, если поток не находится в очереди готовности, а поток, владеющий критическим разделом, не освободил CT, поток не вернется через 5 секунд. что происходит потом? - person Idan; 21.11.2009
comment
Поток входит в ожидание двух разных объектов — события ядра, которое поддерживает критическую секцию, и объекта таймера, срок действия которого истекает через 5 секунд. Если какой-либо из них получает сигнал, то поток возвращается в очередь готовности. - person Michael; 21.11.2009

Поток не будет использовать какие-либо системные ресурсы, потому что он будет помечен как «ожидающий». Как только поток, занимающий критическую область, завершится, он отправит сигнал, который переместит ожидающий поток в очередь готовности.

person dhorn    schedule 20.11.2009

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

person tloach    schedule 20.11.2009