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 evitar condiciones de carrera y interbloqueos, es necesario sincronizar el acceso de múltiples subprocesos a los recursos compartidos. La sincronización también es necesaria para asegurarse de que el código interdependiente se ejecuta en la secuencia adecuada.
Hay varios objetos mediante los que se pueden sincronizar varios subprocesos. Estos objetos incluyen:
- Búferes de entrada de la consola
- Eventos
- Mutexes
- Processes
- Semáforos
- Subprocesos
- Temporizadores
Además de estos objetos en los que se puede esperar, Windows proporciona primitivas de sincronización ligeras que no utilizan identificadores del núcleo:
- Bloqueos ligeros de lector/escritor (SRW) — bloqueos ligeros de lector/escritor para la sincronización intraproceso
- Variables de condición : permite que los subprocesos esperen una condición al liberar un bloqueo.
- Funciones interbloqueadas : operaciones atómicas para la sincronización sin bloqueo de variables compartidas simples
El estado de cada uno de estos objetos es señalizado o no señalizado. Cuando se especifica un identificador para cualquiera de estos objetos en una llamada a una de las funciones de espera, la ejecución del subproceso de llamada se bloquea hasta que el estado del objeto especificado se señale.
Algunos de estos objetos son útiles para bloquear un hilo hasta que ocurra algún evento. Por ejemplo, se envía una señal al identificador del búfer de entrada de la consola cuando hay entrada sin leer, como la pulsación de una tecla o el clic de un botón del ratón. Se envía una señal a los identificadores de proceso y de hilo cuando el proceso o el hilo finaliza. Esto permite que un proceso, por ejemplo, cree un proceso secundario y, a continuación, bloquee su propia ejecución hasta que finalice el nuevo proceso.
Otros objetos son útiles para proteger los recursos compartidos frente al acceso simultáneo. Por ejemplo, varios subprocesos pueden tener cada uno un identificador de un objeto mutex. Antes de acceder a un recurso compartido, los subprocesos deben llamar a una de las funciones de espera para esperar a que el estado del mutex pase a señalado. Cuando el mutex pasa al estado de señal, solo se libera un hilo en espera para acceder al recurso. El estado del mutex se restablece inmediatamente a no señalado, de modo que cualquier otro subproceso en espera permanece bloqueado. Cuando el subproceso haya terminado de utilizar el recurso, debe establecer el estado del mutex en señalado para permitir que otros subprocesos accedan al recurso.
Para los subprocesos de un mismo proceso, los objetos de sección crítica proporcionan un medio de sincronización más eficiente que los mutexes. Una sección crítica se utiliza como un mutex para permitir que solo un hilo a la vez use el recurso protegido. Un subproceso puede usar la función EnterCriticalSection para solicitar la propiedad de una sección crítica. Si ya es propiedad de otro subproceso, se bloquea el subproceso solicitante. Un subproceso puede usar la función TryEnterCriticalSection para solicitar la propiedad de una sección crítica sin bloquearse si no consigue obtenerla. Una vez que recibe la propiedad, el hilo puede usar el recurso protegido. La ejecución de los demás subprocesos del proceso no se ve afectada a menos que intenten entrar en la misma sección crítica.
La función WaitForInputIdle hace que un subproceso espere hasta que se inicialice un proceso especificado y espere la entrada del usuario sin entrada pendiente. Llamar a WaitForInputIdle puede ser útil para sincronizar procesos primarios y secundarios, ya que CreateProcess devuelve sin esperar a que el proceso secundario complete su inicialización.
Para obtener más información, consulte Sincronización.