Funcionamiento de mutex en c++
Considere una situación en la que un hilo ejecuta una sección de código que un mutex ha bloqueado. Ahora, si el planificador decide cambiar el contexto, todos los demás hilos preparados para ejecutar la misma zona están desbloqueados. Solo un hilo de todos los demás podría lograr esto, pero si este hilo intentara ejecutar una parte bloqueada de código, nuevamente se iría a dormir.
Habrá interruptores de contexto repetidos, pero hasta que se libere el bloqueo mutex sobre la sección bloqueada del código, ningún subproceso podrá ejecutarlo. Un hilo que bloqueó un mutex no puede liberarlo.
Por lo tanto, esto asegura que una vez que un hilo bloquea una parte del código, ningún otro hilo puede ejecutar esa región hasta que el hilo bloqueado lo desbloquee.
Entonces, mientras funciona en recursos compartidos, este sistema se asegura de que los subprocesos estén sincronizados.
Al invocar las dos funciones siguientes, se inicializa un mutex y luego se logra un bloqueo: El primer método inicializa un mutex y la segunda función permite el bloqueo de cualquier sección crucial de código.
# Int pthread_mutex_init (pthread_mutex_trylock *restringir mutex, const pthread_mutexattribute_trylock *Restricción del atributo):
Proporciona un mutex con las características definidas por el atributo y una referencia a otro mutex. La propiedad Mutex predeterminada (no recursiva) se utiliza si el atributo es nulo. Si pthread mutex init () es exitoso, devuelve 0 y inicializa y desbloquea el estado de Mutex. Pthread mutex init () devuelve -1 si no tiene éxito.
# int pthread_mutex_lock (pthread_mutex_trylock *mutex):
Clasifica un mutex y bloquea un objeto mutex. El hilo existente debe esperar a que el mutex desbloquee si se ha bloqueado previamente por otro hilo. Un mutex está bloqueado por el hilo que lo bloqueó y ese hilo sigue siendo el propietario de Mutex hasta que ese hilo lo desbloquea. La forma en que se usa un bloqueo puede variar según si el mutex tiene la característica recursiva o no. Cuando el mismo hilo bloquea el mismo tipo de mutex más de una vez, el recuento aumenta y no se crea un hilo de espera.
Para disminuir el recuento a cero, el hilo de propiedad debe hacer un número igual de llamadas a pthread_mutex_unlock ().Si tiene éxito, la función pthread_mutex_lock () devuelve 0. Pthread_mutex_lock () devuelve -1 si falla.
Al realizar las dos acciones indicadas a continuación, el mutex se puede desbloquear y destruir. El bloqueo se puede abrir utilizando la primera técnica y también se puede destruir para que no se pueda usar en el futuro.
# int pthread_mutex_unlock (pthread_mutex_trylock *mutex):
Se libera el objeto mutex. Si varios o más hilos están haciendo cola para bloquear el mutex, Pthread mutex desbloquek () obliga a uno de los hilos a hacerlo. También lo obliga a escapar del bloqueo mutex pthread () con el objeto mutex que había recibido anteriormente. El mutex desbloquea a menos que no se esperen hilos y no tenga propietario en este momento. El uso del bloqueo puede cambiar si el mutex tiene la característica recursiva.
Cuando el mismo hilo bloquea un mutex dado más de una vez, el recuento disminuye en desbloqueo y no se crea un hilo de espera para mantener el bloqueo. Se elimina el mutex y se publicaron los hilos de espera si el recuento se debe a cero. Pthread_mutex_unlock () devuelve 0 si tiene éxito. Pthread_mutex_unlock () devuelve -1 en caso de falla.
int pthread_mutex_destroy (pthread_mutex_trylock *mutex): Elimina un objeto mutex. A veces se le conoce como un identificador mutex del sistema. Los mutexes se utilizan para salvaguardar los recursos compartidos. El mutex se inicializa con un valor erróneo, pero pthread mutex init permite una reinicialización (). El valor de retorno exitoso de pthread_mutex_destroy () es 0. Pthread_mutex_destroy () devuelve -1 en caso de falla.
Ejemplo de mutex en c++
Una ilustración de cómo se realiza la sincronización de hilos con mutexes.
Aquí, primero hemos dado el tamaño de ID de hilo "3". A continuación, hemos inicializado el contador variable que registra la frecuencia con los hilos que se ejecutan. Luego, creamos el bloqueo de objeto para el pthread_mutex_lock. Después de eso, establecimos una función "mutex_func" donde hemos tomado la referencia de bloqueo e inicializado la variable "M" con cero. El valor incremental se ingresa en la variable de contador.
Ahora, hemos definido la función principal de este script. Las dos variables se declaran, una para mutex como "m" y otra para la falla de mutex como "error". Cuando el método "mutex func ()" utiliza el recurso compartido "contador", el mismo mutex está bloqueado. El mutex idéntico se desbloquea después de la función "mutex_func ()". El mutex se elimina una vez que ambos hilos han completado la función principal. Tenga en cuenta que solo se realizan dos tareas respectivamente.
En la salida, puede notar que un hilo ha comenzado. Una vez que el hilo en ejecución no se destruye, la otra tarea que no ha comenzado es la tarea. Por lo tanto, ambos trabajos comienzan y terminan los registros esta vez. Por lo tanto, el uso de la sincronización de hilos habilitados para mutex.
Conclusión
Podemos bloquear el objeto que contiene la funcionalidad esencial de nuestra aplicación mediante el uso de un mutex. Además, esto evita datos inconsistentes, lo cual es crucial para las aplicaciones en tiempo real. Al igual que cómo se implementa la sincronización en otros lenguajes de programación, se emplea mutex. Hemos incorporado un ejemplo para explicar el concepto de std :: mutex en el lenguaje de programación C ++ también.