Критические разделы будут работать (они имеют меньший вес, которые мьютексы.) InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection и DeleteCriticalSection - это функции, которые нужно искать в MSDN.
void func()
{
// cs previously initialized via InitializeCriticalSection
EnterCriticalSection(&cs);
operation1();
operation2();
LeaveCriticalSection(&cs);
operation3();}
}
EDIT: Критические секций быстрее, чем мьютексы, поскольку критические секции в основном пользовательский режим примитивы - в случае uncontended приобретает (как правило, общий случай) нет системного вызова в ядро, и приобретение берет порядка десятков циклов. Переключатель ядра более дорогой (порядка сотни циклов). Единственное время, когда критические секции вызывают в ядро, - это блокировка, которая включает в себя ожидание на примитиве ядра (либо мьютекс, либо событие). Приобретение мьютекса всегда включает вызов в ядро и, следовательно, на порядок медленнее. Однако критические разделы могут использоваться только для синхронизации ресурсов в одном процессе. Для синхронизации нескольких процессов требуется мьютекс.
Исправить пока, но насколько я знаю, CriticalSections использует мьютексы внутри, поэтому выгоды от производительности не существует. –
И тогда для безопасности исключений вы можете перенести cs в класс; см. RAII. – Reunanen
(Так как вопрос о C++.) – Reunanen