2013-05-31 7 views
3

С момента появления библиотеки thread в C++ 11 я просматривал свой код, внося некоторые изменения, чтобы отвести его от многопоточного кода платформы для переносимой стандартной библиотеки код.Сравнение Win32 CMutex и стандартной библиотеки std :: mutex

Однако, я заинтригован, есть ли разница в производительности или функциональности между стандартной библиотекой std::mutex и std::lock_guard<std::mutex> и Win32 конкретного CMutex и CSingleLock.

У меня нет опыта с профилированием многопоточного кода, и я не знаю внутренних компонентов любого из двух классов mutex, поэтому я даже не смог бы угадать догадки.

+5

Как примечание стороны, 'CMutex' и' CSingleLock' не из * Win32 *, а из * MFC *, сторонней библиотеки C++, которая обертывает * Win32 * C-API. Хотя на практике существует, вероятно, соответствие 1-к-1 между «CMutex» и базовым мьютеком Win32. –

+0

@ChristianRau MFC не является третьей стороной: она написана Microsoft. – rubenvb

+3

@rubenvb Тем не менее это не что иное, как обертка вокруг * Win32 * и не связана с ним каким-либо другим способом. Просто две стороны разработали эти две вещи для одной и той же компании. –

ответ

5

Функциональность почтительность обязательно - CMutex карты непосредственно в Win32 типа мьютекса в то время как std::mutex путь более простой, вероятно, реализуется с использованием win32 CRITICAL_SECTION удаления рекурсивной природы и std::recursive_mutex оберточной CRITICAL_SECTION. Они будут работать аналогично CCriticalSection.

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

Если вы поставили вопрос на вопрос recursive_mutex против CCriticalSection, я бы поставил на практически такое же исполнение. Интерфейс CSingleLock имеет полностью интерфейс braindead (он принимает второй аргумент, который по умолчанию равен FALSE вместо TRUE), поэтому на практике я никогда не использовал его напрямую только через макрос, чтобы избежать ошибки.

В новом коде я сначала попытался решить все, используя std::future, и скрипку с замками только в крайнем случае. Потоки C++ 11 имеют смысл использовать, поэтому, пока вам не понадобится CMultiLock, это лучше. Я еще не исследовал, как покрыть последний случай, но был бы удивлен, если это нелегко сделать.