Библиотека синхронизации пользовательского режима для C ++ - PullRequest
3 голосов
/ 27 ноября 2009

Кто-нибудь знает библиотеку синхронизации потоков в пользовательском режиме Windows для C ++ (использующую спин-блокировки / атомарные операции)? Мне нужны только мьютексы (~ критические секции), но условные переменные были бы плюсом.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2009

У вас есть выигрыш 32: http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx. У вас есть полное объяснение синхронизации с использованием этой библиотеки здесь .

2 голосов
/ 27 ноября 2009

Как сказал Патрис, вы можете использовать библиотеку win32 для пользовательского режима (критическая секция содержит spincount, который будет вращаться).

Visual Studio 2010 Beta2 / Win7 x64 содержит Concurrency Runtime (ConcRT), которая построена на запланированных потоках пользовательского режима, которые позволяют ConcRT обнаруживать блокировку ядра и переключаться на другую задачу в пользовательском режиме (более низкие издержки) чем типичный контекстный обмен). Так, например, если вы используете boost :: thread и их условные переменные и мьютексы для задачи в ConcRT, они будут обрабатываться в пользовательском режиме.

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

Энтони Уильямс имеет реализацию std :: thread для продажи на своем веб-сайте, которая включает в себя библиотеку атомарности из C ++ 0x, если вы действительно хотите создать свои собственные спин-блокировки.

В общем, если вы не выполняете очень мелкозернистую синхронизацию, где вы гарантируете, что не будет много споров, я бы посоветовал вам быть осторожным с использованием спин-блокировок, они, как правило, «вращаются» и, как таковые, потреблять ресурсы системного процессора ...

-Rick

1 голос
/ 28 ноября 2009

Спасибо за ответы. Оказывается, что мои ожидания относительно размера библиотеки потоков на boost были плохой идеей, а написание собственного кода синхронизации на основе InterlockedExchange очень просто. Мой код спин-блокировки достигает производительности примерно на 20% лучше, чем критические разделы Win32 (и я имею в виду реальную производительность приложений, а не синтетический тест):)

...