Acerca de la sincronización

Para sincronizar el acceso a un recurso, use uno de los objetos de sincronización en una de las funciones de espera. El estado de un objeto de sincronización es señalizado o no señalizado. Las funciones de espera permiten que un hilo bloquee su propia ejecución hasta que un objeto especificado en estado no señalado pase al estado señalado. Para obtener más información, consulte Sincronización entre procesos.

Elección del primitivo de sincronización adecuado

Primitivo Ámbito Performance Reentrante Cuándo se deben usar
Bloqueo Slim Reader/Writer (SRW) Proceso único Rápido (normalmente en modo de usuario; puede pasar al modo kernel en caso de contención) No Opción predeterminada para cargas de trabajo de lectura intensivas en código moderno. La menor huella de memoria (del tamaño de un puntero).
Sección crítica Proceso único Rápido (gira y luego espera del kernel) Úselo cuando necesite un bloqueo reentrante o recursivo dentro de un proceso. Ligeramente mayor que SRW.
Mutex Entre procesos (con nombre) Más lento (siempre objeto del núcleo) Necesario para la sincronización entre procesos mediante un mutex con nombre. También resulta útil con WaitForMultipleObjects.
Semáforo Entre procesos (con nombre) objeto del núcleo N/A Limita el acceso simultáneo a un grupo de recursos (por ejemplo, el grupo de conexiones de N elementos).
Event Entre procesos (con nombre) objeto del kernel N/A Señalización entre hilos/procesos. Use para las notificaciones de "algo ocurrido", no para proteger los datos.
C++ std::mutex / std::shared_mutex Proceso único Definido por la implementación No Se prefiere para código portátil en C++ y RAII. Use cuando no necesite api de espera de Win32 ni sincronización entre procesos.

Note

Bloqueos SRW frente a secciones críticas: Para el código nuevo que no requiere bloqueo recursivo, prefiera los bloqueos SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). Son más pequeños, más rápidos y admiten la semántica lector/escritor. Las secciones críticas siguen siendo adecuadas cuando se necesita una adquisición reentrante (recursiva) por parte del mismo hilo.

Importante

Error común: usar un Mutex para la sincronización intraproceso cuando una sección crítica o un bloqueo SRW serían suficientes. Los mutex siempre implican una transición al modo kernel, lo que los hace significativamente más lentos en operaciones de alta frecuencia dentro de un único proceso.

A continuación se muestran otros mecanismos de sincronización:

Para obtener más información sobre la sincronización, consulte Problemas de sincronización y multiprocesador.