WaitForMultipleObjects vs CRITICAL_SECTION - PullRequest
       3

WaitForMultipleObjects vs CRITICAL_SECTION

2 голосов
/ 09 сентября 2011

Я понимаю, что и WaitForMultipleObjects, и CRITICAL_SECTION предназначены для ожидания завершения потоков.И оба они описываются как механизмы синхронизации процессов и потоков между потоками.Могут ли они использоваться взаимозаменяемо, если они предназначены для достижения той же цели?Если нет, то в чем разница между ними?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Они не являются взаимозаменяемыми и служат различным целям.

A критическая секция является мьютексом. Блоки кода, обернутые в критический, могут вводиться одним потоком за раз. Это также называется сериализацией, поскольку защищенные блоки выполняются последовательно.

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

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

0 голосов
/ 09 сентября 2011

Critical Section - это пользовательский объект (обратите внимание на ядро), поэтому он быстрее, чем любой mutex (это базовый объект, поэтому требуется системный вызов ядра). В результате CS может использоваться для синхронизации только потоков внутри одного процесса (вы не можете использовать один CS в разных процессах). WaitForMultipleObjects использует core объекты для синхронизации (мьютексы, события), поэтому он может фактически использоваться для межпроцессной синхронизации. Чтобы использовать CS таким же образом, вам также потребуется conditional variable (не в Win XP, только позже).

0 голосов
/ 09 сентября 2011

Я думаю, что цитата из MSDN достаточно:

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

То есть Critical Sections для синхронизации одного процесса. С WaitForMultipleObjects вы можете выполнять несколько процессов.

Я добавлю, что с WaitForMultipleObjects вы можете ждать других вещей, таких как, например, функции асинхронного ввода-вывода, таймеры ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...