защита критической секции мьютексом

Допустим, у меня есть общий объект, часть кода которого защищена критическим разделом, и более 1 потока обращаются к объекту для чтения/записи. Когда поток находится внутри критической секции, другие потоки ждут. Как только поток выходит из CS, ОС предоставляет доступ к любому из ожидающих потоков.

Если я ограничен только одним процессом, является ли CS хорошей защитой для общего объекта?

Я спрашиваю, потому что я видел в Интернете, что правильный способ сделать это — использовать объект ядра (например, мьютекс, семафон) для защиты CS. Поток, желающий использовать общий ресурс, должен сначала получить мьютекс/семафор с помощью функции типа WaitForSingleObject. Если используется мьютекс, то только один из них может получить доступ к ресурсу. Как только мьютекс получен, поток входит в CS, делает то, что должен делать, затем выходит из CS и освобождает мьютекс. Затем ОС позволяет любому другому ожидающему потоку получить мьютекс и так далее и тому подобное.

Но разве это не то же самое, что использовать только CS?

Кроме того, использование мьютекса должно быть значительно медленнее, чем использование одного CS. Единственная проблема, которую я вижу при использовании только CS, заключается в том, что если поток выходит из строя внутри CS, другие потоки могут никогда не получить доступ к общему ресурсу.

Есть ли другая причина, по которой этот подход лучше? заранее спасибо


person user1599391    schedule 16.08.2012    source источник
comment
Следует ли перенести это в раздел Информатика?   -  person Greg    schedule 17.08.2012
comment
Я никогда не видел кода, который делает то, что вы говорите, что видели. Можете ли вы указать какой-нибудь код, который получает мьютекс или семпахору, а затем получает критическую секцию с той же областью действия? Я подозреваю, что вы просто неправильно читаете или неправильно понимаете этот код, и это является источником вашего замешательства. (Возможно также, что вы путаете два разных значения термина «критическая секция». Одно означает конкретный примитив синхронизации, а другое — область кода, защищенную синхронизацией, подобной мьютексу.)   -  person David Schwartz    schedule 17.08.2012
comment
Спасибо, Дэвид, я имею в виду структуру окон CSection (InitializeCS, EnterCS, LeaveCS, DeleteCS). Может быть, я неверно истолковал прочитанное?   -  person user1599391    schedule 17.08.2012
comment
Критическая секция Windows — это мьютекс, связанный с процессом. Он отлично работает внутри процесса. Никакой дополнительной защиты не требуется.   -  person Martin James    schedule 17.08.2012


Ответы (1)


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

В компьютерных науках термин «критическая секция» используется для областей кода, которые должны выполняться исключительно (обычно из-за совместного использования данных). В Windows есть объект синхронизации с именем CRITICAL_SECTION, который можно использовать для предоставления эксклюзивного доступа к областям выполнения. Еще одним атрибутом объекта CRITICAL_SECTION в Windows является то, что его можно использовать только в одном процессе.

В компьютерных науках термин «мьютекс» часто используется для описания объекта, который можно использовать для обеспечения синхронизации между параллельными или непрерывными потоками выполнения. В Windows также есть объект мьютекса, который можно создать с помощью функции CreateMutex() (которая возвращает HANDLE, представляющий мьютекс). Этот объект можно использовать для синхронизации доступа между потоками в одном и том же или разных процессах, поэтому его можно использовать аналогично CRITICAL_SECTION (но с другими API) во многих отношениях. Если вы хотите синхронизировать потоки выполнения, находящиеся в разных процессах, можно использовать объект мьютекса, а объект CRITICAL_SECTION — нет.

Итак, чтобы ответить на ваш вопрос (я думаю), если вы заинтересованы только в защите критического раздела среди потоков, которые являются частью одного и того же процесса, объект CRITICAL_SECTION должен быть адекватным. Вместо этого можно использовать объект мьютекса, но он может быть несколько менее производительным. Не должно быть необходимости использовать оба типа объектов

person Michael Burr    schedule 16.08.2012