2011-08-02 13 views
11

puede alguien por favor explicar cuál es la diferencia si lo hagoobjeto mutex vs eventos en Windows

mutex = createMutex 
waitForSingleObject 
Release(mutex) 

y

event = createEvent 
waitForSingleObject 
Release(event) 

Estoy tan confundido, ¿puedo usar ambas versiones para la sincronización? gracias de antemano por cualquier ayuda

Respuesta

12

Utiliza un mutex para garantizar que solo un hilo de ejecución pueda acceder a algo. Por ejemplo, si desea actualizar una lista que potencialmente puede ser utilizado por múltiples hilos, que tendría que utilizar un mutex:

acquire mutex 
update list 
release mutex 

Con un mutex, sólo un hilo a la vez puede ser la ejecución de la "lista de actualización ".

Utiliza un evento de restablecimiento manual si desea que varios subprocesos esperen a que suceda algo antes de continuar. Por ejemplo, comenzó varios subprocesos, pero están pausados ​​esperando algún otro evento antes de que puedan continuar. Una vez que ocurre ese evento, todos los hilos pueden comenzar a ejecutarse.

El hilo principal podría tener este aspecto: Código

create event, initial value false (not signaled) 
start threads 
do some other initialization 
signal event 

Cada hilo de sería:

do thread initialization 
wait for event to be signaled 
do thread processing 
+0

¿cuál es un valor inicial del mutex: señalizado o no señalizado? – yeap

+0

@yeap: en casi todos los casos, incluido este, desea crear el mutex para que no se adquiera inicialmente. –

+1

Una diferencia importante es que un mutex se puede bloquear repetidamente por el mismo hilo (es "recursivo") mientras que un evento se puede usar para implementar el bloqueo no recursivo. –

1

Sí, ambos se pueden utilizar para la sincronización pero de diferentes maneras.

Mutex es un objeto de exclusión mutua y solo se puede adquirir por una sola instancia a la vez. Se utiliza para evitar el uso simultáneo de un recurso común, como una variable global, por piezas de código de computadora

El evento es un objeto que se puede establecer explícitamente en un estado mediante la función SetEvent.

+0

¿Qué quiere decir "de un diente"? ¿Puede el evento ser adquirido por múltiples instancias? mutex también se puede señalar si hago waitForSingleObject, ¿estoy equivocado? – yeap

+0

sí, ambos y, de hecho, cualquier objeto de sincronización se puede usar en WaitForSingleObject/WaitForMultipleObject. La diferencia está en su comportamiento. – cprogrammer

+0

un evento no se adquiere como un mutex o se adquiere una sección crítica. Un evento puede ser señalado cuando ocurre un evento. – cprogrammer

Cuestiones relacionadas