Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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) | Sí | Ú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) | Sí | 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:
- entrada y salida superpuestas
- llamadas a procedimientos asincrónicos
- objetos de sección críticos
- variables de condición
- bloqueos de lector/escritor limitados
- Inicialización única
- acceso a variables interbloqueadas
- listas enlazadas individuales interbloqueadas
- colas de temporizadores
- la macro MemoryBarrier
Para obtener más información sobre la sincronización, consulte Problemas de sincronización y multiprocesador.