2012-02-21 19 views
7

Tengo 6 hilos. Uno de los subprocesos se encuentra en algún ámbito y activa el 'bloqueo' y todos los demás hilos están esperando y desean ingresar al mismo ámbito.¿'Lock' tarda tiempo de CPU?

Ahora, ¿los otros hilos tendrán tiempo de CPU? ¿El otro hilo está en el calendario de hilos? Entiendo que todos los demás subprocesos están en estado de espera, pero la CPU intentará hacer que el subproceso continúe e intente entrar en el alcance (incluso si no se puede acceder al alcance)

+1

Según tengo entendido, los otros subprocesos seguirán recibiendo segmentos, que usarán para verificar el estado del bloqueo. Si la cerradura sigue en su lugar, volverán a dormir, de lo contrario continuarán. – xbonez

+0

esto es lo que también entendí, pero esto lleva tiempo de CPU ... por lo tanto, este es un tipo de espera ocupada, y esto es muy malo. – Yanshof

Respuesta

10

Al intentar ingresar un bloqueo que es ya realizado, enhebra el primer spinlock por un tiempo y finalmente suspende e ingresa un estado de espera.

Todavía queman el tiempo de CPU mientras giran, pero ya no una vez que esperan.

+6

Para expandir un poco: el spinwait se hace porque es más barato que una transición de kernel y, por lo tanto, se optimiza para el caso en que el bloqueo solo se contenga ligeramente. – Richard

+0

¿Qué es spinlock? ¿Puedes responder en 1 oración? –

+2

@Royi El hilo sigue comprobando si el aspecto está libre en un bucle. Algo así como 'while (! Lock.TryEnter()) {}' Graba la CPU, pero evita la sobrecarga de una transición de kernel y programación de subprocesos. Es bueno si el bloqueo se libera pronto, pero es malo si lleva más tiempo. Es por eso que 'lock' gira un rato y luego espera. – CodesInChaos

0

Así no es como funciona el bloqueo. No le darás a nadie más "tiempo de CPU". Si está bloqueando, puede introducir períodos de espera y posibles interbloqueos donde los hilos están esperando el uno al otro.

Cuestiones relacionadas