Почему мьютекс Win32 так трудоемок? - PullRequest
2 голосов
/ 22 мая 2011

Я читаю книгу Windows через C / C ++. В главе 8 на стр. 215 автор сравнил производительность различных механизмов синхронизации. И я обнаружил плохую производительность мьютекса. Когда 4 потока выполняются одновременно, он потратил более двадцать три секунды на синхронизацию мьютекса.

Почему мьютекс Win32 так трудоемок? И когда мы можем использовать мьютекс?

PS: я разместил тестовый код в GitHub: https://gist.github.com/985198

Спасибо за ваши ответы.

Ответы [ 3 ]

8 голосов
/ 22 мая 2011

Мьютекс в Win32 - это объект ядра, что означает, что при каждом его использовании (Wait, Release) требуется системный вызов, который переключается в режим ядра и обратно в режим пользователя. Плюс, если ваш поток действительно должен ждать мьютекс, он теряет свой квант, в то время как другой поток, который может работать, запланирован на ЦП. В WinXP и более ранних версиях (и, возможно, в некоторых более поздних версиях Windows) мьютексы были «честными», что означает, что если ваш поток последним ожидал мьютекс, он был бы последним, чтобы получить его, что еще больше увеличивает вероятность конфликта.

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

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

7 голосов
/ 22 мая 2011

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

1 голос
/ 22 мая 2011

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

...