Разница между замками, мьютексом и критическими секциями - PullRequest
12 голосов
/ 11 мая 2010

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

Итак, я хочу знать, могут ли критические секции использоваться для синхронизации потоков между процессами.

Кроме того, что подразумевается под сигнальными состояниями и не сигнальными состояниями

Ответы [ 4 ]

7 голосов
/ 11 мая 2010

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

3 голосов
/ 11 мая 2010

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

CSingleLock (в данном контексте я предполагаю, что вы называете это замком) - это класс-оболочка, использующий концепцию RAII . Это помогает вам получить объект синхронизации потоков (в его конструкторе) и легко вызывать API блокировки и разблокировки. (скрывает все внутренние детали того, какие объекты синхронизации он использует).

CSingleLock при использовании с критическими разделами не может использоваться в процессе. Где, как Mutex может быть использован для этой цели.

Когда поток получает Mutex, и никакие другие потоки не могут получить Mutex, тогда состояние Mutex считается не подписанным. ЕСЛИ Mutex доступен и никакие потоки не получены, то он находится в состоянии Signeled.

2 голосов
/ 11 мая 2010

1) Критическая секция - это мост между Пользователем и Interlocked-операциями. Он использует операции inetrlocked-exchange для блокировки и разблокировки ваших потоков. Работает быстрее мьютексов.

2) Мьютекс является ядром объекта. Работает не быстро, но имеет ряд преимуществ. Прежде всего, именованные мьютексы могут использоваться в разных процессах. Во-вторых, если поток завершается, мьютекс, заблокированный этим потоком, разблокируется.

2 голосов
/ 11 мая 2010

CriticalSections находятся в процессе. Именованные мьютексы могут использоваться в процессах

Lock - это общий термин, поэтому я не знаю, какую платформу вы имеете в виду. Например, в C # блокирующий примитив является критическим разделом.

...