Las secciones críticas funcionarán (son más livianas que las de exclusión mutua) InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection y DeleteCriticalSection son las funciones que se deben buscar en MSDN.
void func()
{
// cs previously initialized via InitializeCriticalSection
EnterCriticalSection(&cs);
operation1();
operation2();
LeaveCriticalSection(&cs);
operation3();}
}
EDIT: Las secciones críticas son más rápidos que los mutex ya que las secciones críticas son principalmente primitivas modo de usuario - en el caso de una adquisición uncontended (por lo general el caso común) no hay ninguna llamada al sistema en el núcleo, y la adquisición de toma del orden de docenas de ciclos. Un cambio de kernel es más caro (del orden de cientos de ciclos). La única vez que las secciones críticas llaman al kernel es para bloquear, lo que implica esperar en una primitiva del kernel (ya sea mutex o evento). La adquisición de un mutex siempre implica una llamada al kernel y, por lo tanto, los pedidos de magnitud son más lentos. Sin embargo, las secciones críticas solo se pueden usar para sincronizar recursos en un proceso. Para sincronizar en múltiples procesos, se necesita un mutex.
Correcto hasta el momento, pero hasta donde yo sé, CriticalSections usa mutexes internamente, por lo que no hay un beneficio de rendimiento. –
Y luego, para la seguridad de las excepciones, podría incluir cs en una clase; ver RAII. – Reunanen
(Dado que la pregunta es sobre C++) – Reunanen