Sincronización de la ejecución de varios subprocesos

Para evitar las condiciones de carrera y los interbloqueos, es necesario sincronizar el acceso de varios 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 cuyos identificadores se pueden usar para sincronizar varios subprocesos. Estos objetos incluyen:

  • Búferes de entrada de consola
  • Eventos
  • Mutexes
  • Procesos
  • Semáforos
  • Subprocesos
  • Temporizadores

El estado de cada uno de estos objetos se señala o no. 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 que realiza la llamada se bloquea hasta que se señala el estado del objeto especificado.

Algunos de estos objetos son útiles para bloquear un subproceso hasta que se produzca algún evento. Por ejemplo, se señala un identificador de búfer de entrada de consola cuando no se ha leído la entrada, como una pulsación de tecla o un clic del botón del mouse. Los identificadores de proceso y subproceso se indican cuando finaliza el proceso o el subproceso. 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 un identificador para un objeto de exclusión mutua. Antes de acceder a un recurso compartido, los subprocesos deben llamar a una de las funciones de espera para esperar a que se indique el estado de la exclusión mutua. Cuando se señala la exclusión mutua, solo se libera un subproceso en espera para acceder al recurso. El estado de la exclusión mutua se restablece inmediatamente a no señalizado, por lo que cualquier otro subproceso en espera permanece bloqueado. Cuando el subproceso finaliza con el recurso, debe establecer el estado de la exclusión mutua en señalizado para permitir que otros subprocesos accedan al recurso.

Para los subprocesos de un único proceso, los objetos de sección crítica proporcionan un medio más eficaz de sincronización que las exclusiones mutuas. Se usa una sección crítica como una exclusión mutua para habilitar un subproceso a la vez para usar 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, el subproceso solicitante se bloquea. Un subproceso puede usar la función TryEnterCriticalSection para solicitar la propiedad de una sección crítica, sin bloquear si no se puede obtener la sección crítica. Una vez que recibe la propiedad, el subproceso es libre de usar el recurso protegido. La ejecución de los demás subprocesos del proceso no se ve afectada a menos que intenten escribir la misma sección crítica.

La función WaitForInputIdle hace que un subproceso espere hasta que se inicialice un proceso especificado y espere a que la entrada del usuario no tenga ninguna 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.