2010-10-22 21 views
5

Esto se trata principalmente de la comprensión del concepto, que me confunde.Modelo Productor-Consumidor - semáforo binario o mutex?

objeto mutex significa que un hilo toma el control del acceso del recurso compartido, realiza las operaciones y la abre, entonces sólo otro hilo puede tener acceso para bloquear

mientras semáforo binario es como un hilo puede tener acceso al recurso compartido, pero el acceso a la obtención de la cerradura, mientras que otro hilo puede desbloquearlo

En la última pregunta que vi sobre here, se mencionó que "semaphores are more suitable for some synchronization problems like producer-consumer".

Mi pregunta es, por ejemplo, si el hilo del productor ha ganado bloqueo y llenando algunas filas con datos, y el consumidor al mismo tiempo lo desbloquea, ¿no hay ningún problema de simultaneidad?

Respuesta

11

Trataré de resolver la confusión lo mejor que pueda. Explicaré los conceptos de la forma tradicionalmente definida. El problema es que la gente comienza a mezclar el significado de muchos de estos conceptos y de eso surge mucha confusión.

Cada vez que tenemos un fragmento de código que modifica un poco de memoria (por ejemplo, una variable) que se comparte entre diferentes procesos o subprocesos, tenemos una sección crítica . Si no nos ocupamos de sincronizar este bit de código correctamente, obtendremos errores. Un ejemplo de una sección crítica es un productor que agrega un elemento a un contenedor compartido de algún tipo.

Una forma de sincronizar secciones críticas es aplicar exclusión mutua. La exclusión mutua significa que solo un proceso o hilo a la vez puede ejecutar la sección crítica y obtener acceso a la pieza de memoria compartida. Tenga en cuenta que la exclusión mutua no es un mecanismo en sí mismo, es un principio que podemos aplicar por diferentes medios. Algunas personas hablan sobre bloqueos y semáforos binarios como mutexes, pero eso mezcla los conceptos de una manera que dará lugar a confusión.

A semáforo binario es una forma de forzar la exclusión mutua. Cada vez que un proceso desea obtener acceso al mutex puede adquirir el semáforo. Esta operación bloqueará si hay otro proceso sosteniendo el semáforo en ese momento. Por lo tanto, tenemos exclusión mutua. Una vez que se realiza un proceso con el mutex, liberamos el semáforo permitiendo que otros procesos entren en el mutex. De esta forma podemos lograr la exclusión mutua con un semáforo binario, pero de ninguna manera es la única aplicación posible de un semáforo binario.

Los semáforos son agradables para los problemas productor-consumidor porque pueden asumir un número natural arbitrario, no solo 0 y 1 en el caso de semáforos binarios. Esto es muy útil cuando se sincronizan problemas productor-consumidor porque puede permitir que el valor de un semáforo contenga la cantidad de elementos disponibles. Si la cantidad de elementos desciende a cero, las operaciones del semáforo se bloquearán automáticamente.

Me doy cuenta de que la explicación del problema productor-consumidor es un poco breve y lo animo a buscar soluciones que utilicen semáforos y también comparar estas soluciones a otras soluciones que utilizan otras construcciones de sincronización como monitores o mensajes. He encontrado que es muy esclarecedor.