Intereting Posts
Shiboken2 и пользовательский виджет Qt Может ли OpenCV для Android использовать стандартную поддержку C ++ для поддержки встроенной сборки на Android Studio 2.2 для Windows? связывание пользовательского расширения файла с помощью приложения java в windowsх Как инициализировать именованный том, общий для нескольких контейнеров с помощью dockerы Bash относительная дата (x дней назад) Определите, использует ли кто-то Nginx, Apache или Lighttpd Rails route to model instance – по имени домена Монтирование webdav акций с помощью davfs2 Команда «установить» Linux для установки подстановки Добавление переменной% TIME% в скрипт cmd windows Как я могу получить то, что вернула моя основная функция? Ошибка python ctypes.WinDLL, _dlopen (self._name, mode) не может быть найдена Как предотвратить запуск программы Linux более одного раза? Как изменить окончание файла для Windows или Mac-файла в Linux? перезапустить контейнер nginx при обновлении серверов восходящего streamа

Стоимость мьютекса, критического раздела и т. Д. В Windows

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

Также известны Futexes в Linux.

То же самое хорошо в Windows? Является ли Critical Section более подходящей картой для мьютексов в Linux.

Из того, что я собрал, критические разделы обеспечивают лучшую оптимальную производительность по сравнению с Mutex, это верно для каждого случая?

Есть ли угловой случай, когда мьютексы быстрее, чем критический раздел в Windows.

Предположим, что только один stream процессов обращается к мьютексам (просто для устранения другого преимущества критических разделов)

Добавлена ​​информация: OS Windows Server,
Язык C ++

Учитывая специфическую цель Critical Sections и Mutexes я не думаю, что вы можете задать вопрос относительно стоимости, поскольку у вас мало альтернативы, когда вам нужно несколько streamов, затрагивающих одни и те же данные. Очевидно, что если вам просто нужно увеличивать / уменьшать число, вы можете использовать функции Interlocked*() на volatile номере, и вам хорошо идти. Но для чего-то более сложного вам нужно использовать объект синхронизации.

Начните чтение здесь в объектах синхронизации, доступных в Windows ^ . Все функции перечислены там, хорошо сгруппированы и правильно объяснены. Некоторые из них – только для Windows 8.

Что касается вашего вопроса, Critical Sections дешевле, чем Mutexe поскольку они предназначены для работы в одном и том же процессе. Прочтите это ^ и это ^ или только следующую цитату.

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

Я использую Critical Sections для такой же синхронизации процессов и Mutexes для межпроцессной синхронизации. Только когда мне действительно нужно знать, был ли исключен объект синхронизации, я использую Mutexes в том же процессе.

Итак, если вам нужен объект синхронизации, вопрос не в том, какие издержки, но что дешевле 🙂 Там действительно нет альтернативы, кроме повреждения памяти.

PS : Там могут быть альтернативы, подобные тем, которые упомянуты в выбранном ответе здесь, но я всегда использую базовую функциональность платформы и кросс-платформенность. Это всегда быстрее! Поэтому, если вы используете Windows, используйте инструменты Windows 🙂

ОБНОВИТЬ

Исходя из ваших потребностей, вы можете уменьшить необходимость в объектах синхронизации, пытаясь сделать как можно больше автономной работы в streamе и объединять данные в конце или время от времени.

Глупый пример . Возьмите список URL-адресов. Вам нужно очистить их и проанализировать.

  1. Бросьте кучу streamов и начните выбирать URL-адреса, один за другим, из списка ввода. Для каждого вашего процесса вы централизуете результаты по мере их выполнения. Это в реальном времени и круто
  2. Или вы можете создавать streamи, каждый из которых имеет кусочек входных URL-адресов. Это устраняет необходимость синхронизации процесса выбора. Вы сохраняете результат анализа в streamе, и в конце вы объединяете результат только один раз. Или только один раз каждые 10 URL, скажем так. Не для каждого из них. Это значительно сократит операции синхронизации.

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

PS : Я только думаю в URL-адресах 🙂

ОБНОВЛЕНИЕ 2:

Если бы в проекте было какое-то измерение. И результаты были довольно неожиданными:

  • std::mutex является самым дорогим. (цена межплатформенности)
  • Собственный Mutex Windows в 2 раза быстрее, чем std .
  • Critical Section в 2 раза быстрее, чем собственный Mutex .
  • SlimReadWriteLock составляет + -10% от Critical Section .
  • Мой домашний InterlockedMutex ( spinlock ) на 1,25x – 1,75x быстрее, чем Critical Section .

Использование std :: mutex в Windows 8 Обычно я получаю 3-4-кратное улучшение (в случае непротиворечивого случая), используя мою собственную специальную блокировку вращения:

на основе мьютекса

 auto time = TimeIt([&]() { for (int i = 0; i < tries; i++) { bool val = mutex.try_lock(); if (val) { data.value = 1; } } 

});

домашний замок

 time = TimeIt([&]() { for (int i = 0; i < tries; i++) { if (!guard.exchange(true)) { // I own you data.value = 1; guard.store(true); } } }); 

Тесты выполняются на x86.

Я не понял, что std :: mutex использует подчеркивание для окон, потому что он генерирует много кода.