Разница в производительности между мьютексом и критической секцией в C ++ - PullRequest
3 голосов
/ 10 октября 2011

Я читал в этом посте о различиях производительности в C # между критическими секциями и мьютексами для данного тестового примера. Я задаюсь вопросом, есть ли какая-либо дополнительная документация, которая дает накладные расходы производительности для различных классов блокировки для приложения C ++, особенно MFC, работающего на платформе Windows 32 или 64 бита?

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

Отсюда вопрос: кто-нибудь знает какую-либо справочную документацию, касающуюся издержек производительности различных механизмов блокировки MFC на разных платформах Windows?

Ответы [ 3 ]

6 голосов
/ 10 октября 2011

Насколько я понимаю, Win32 Mutex - полноценный объект ядра.Это означает, что любой вызов Mutex будет включать системный вызов.Это часто приводит к аннулированию кэша и, следовательно, может быть довольно дорогим.

Критические разделы - это объекты на стороне пользователя, которые не используют ядро ​​в тех случаях, когда нет конфликтов.Вероятно, это делается с помощью инструкции ассемблера x86 LOCK или аналогичной, чтобы гарантировать атомарность.Поскольку системный вызов не выполняется, он будет быстрее, но поскольку это не объект ядра, нет способа получить доступ к критическому разделу из другого процесса.

1 голос
/ 10 октября 2011

Прочитайте следующую статью поддержки от Microsoft: http://support.microsoft.com/kb/105678.

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

Speed. Обзор синхронизации говорит о критических разделах следующее:

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

Тупик. Обзор синхронизации говорит о мьютексах следующее:

Если поток завершается без освобождения владельца мьютекса объект, мьютекс считается заброшенным. Ожидание может получить право собственности на заброшенный мьютекс, но функцию ожидания возвращаемое значение указывает, что мьютекс отменен. WaitForSingleObject () вернет WAIT_ABANDONED для мьютекса, который имеет был заброшен Однако ресурс, который защищает мьютекс, оставлен в неизвестном состоянии.

Невозможно определить, был ли заброшен критический участок.

1 голос
/ 10 октября 2011

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

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

...