2010-01-02 11 views
14

Encontrado en torvalds/linux-2.6.git -> kernel/mutex.c línea 171¿Qué tipo de bucle es para (;;)?

He intentado encontrarlo en Google y todo eso fue en vano.

¿Qué significa for (;;) instruir?

+32

eso no es un comentario útil. El hecho de que Konman no sea tan versado en C no significa que no puedan leer archivos de códigos. Y ahora han aprendido algo, eso es algo bueno. –

+10

Estoy de acuerdo con Alastair. La fuente de lectura escrita por otros es una excelente manera de aprender. – CesarGon

+20

Si no conoce bien c, lea el código del kernel. –

Respuesta

20

El para (;;) es una condición de bucle infinito, similar a while (1) como la mayoría ya ha mencionado. Con mayor frecuencia vería esto, en los códigos mutex del kernel, o mutex, por ejemplo, problemas como los filósofos del comedor. Hasta que la variable mutex se establezca en un valor particular, de modo que un segundo proceso obtenga acceso al recurso, el segundo proceso siga en bucle, también conocido como espera ocupada. El acceso a un recurso puede ser acceso al disco, para lo cual 2 procesos están compitiendo para obtener acceso utilizando un mutex de modo que a la vez solo un proceso tenga acceso al recurso.

+1

Loops infinitos y esperas ocupadas son cosas diferentes. Una espera ocupada es un bucle * insomne ​​* esperando alguna condición, nada infinito al respecto. –

+2

@Jim, para ser justos, ningún lazo es infinito ya que podrías perder potencia en cualquier momento o tu máquina morirá de viejo. Está hablando más sobre pedirle al compilador un ciclo sin fin que en realidad algo infinito. – Blindy

+1

@Blindy Manera de perder el punto y ser absurdamente pedante al mismo tiempo. Como duh, no sabía acerca de la muerte por calor del universo. Mientras tanto, las esperas * ocupadas son, como dije, insomnes, * y * tienen condiciones de finalización. –

46

Literalmente significa "no hacer nada, hasta que no pase nada y en cada paso, no haga nada para prepararse para el próximo". Básicamente, se trata de un ciclo infinito que tendrá que romper de alguna manera desde adentro usando una declaración break, return o goto. .

+1

Thumbs up for the speed :) – Anna

5

mismo enlaza siempre (hasta que el código dentro del bucle llama break o return, por supuesto while(1) es equivalente, Personalmente me parece más lógico usar ese

+1

O llama a exit o longjmp o realiza una salida del ciclo, o (POSIX) hasta que se produce una señal que no retorna. Además, varios tipos de comportamiento indefinido pueden dar por terminado el ciclo, así como varios eventos externos más allá del alcance del lenguaje C, incluida la colocación de un nuke en la computadora en la que se ejecuta el programa. –

4

Es equivalente a while(true)

Editar.: Dado que ha habido un debate provocado por mi respuesta (buen debate, téngalo en cuenta) debe aclararse que esto no es del todo exacto para los programas C no escritos en C99 y más allá, donde stdbool.h ha establecido el valor de verdadero = 1.

+4

siempre que sea verdadero == 1. –

+12

Necesitan un sistema de devolución de comentarios. – Blindy

+1

Hola, solo está tratando de asegurarse de que las personas protejan sus aplicaciones en el futuro contra la posibilidad de que cambie el valor de "verdadero". –

9

Es un bucle infinito que no tiene condición inicial, no hay condición de incremento y no hay condición final. Entonces iterará por siempre equivalente a while (1).

+4

al menos un compilador que sé advertirá mientras (1) o mientras (verdadero) bucles, pero "saber" para no producir diagnósticos para (;;) ya que se considera la forma "estándar" para bucle infinito. –

2

Es lo mismo que escribir bucle infinito usando la instrucción "for" pero tiene que usar break o alguna otra instrucción que pueda salir de este bucle.

1

I significa:

#define EVER ;; 

for(EVER) 
{ 
    // do something 
} 

Advertencia: El uso de este en su código es sumamente desalentador.

+6

Realmente lo odio cuando veo código como este. El autor obviamente piensa que es más claro, pero a menudo tengo que retroceder y asegurarme de que NUNCA se defina como algo malo que me cause problemas. – Fredrik

+0

Cierto, tampoco escribiría para (NUNCA) en mi código. Esto es solo por diversión :) – JCasso

+0

De hecho, no hagas esto en código real. – Ree

0

Eso fue obviamente una condición de bucle infinito.

0

Es un bucle infinito que tendrá que romper de alguna manera desde adentro usando una instrucción break, return o goto. o bien alguna interrupción sucede lo contrario este bucle se ejecutará infinitamente y ejecuta; (instrucción nula) cada vez que

1

para (;;)

es un bucle infinito al igual que while(1). Aquí no se da ninguna condición que termine el ciclo. Si no lo está rompiendo usando la declaración break, este ciclo nunca llegará a su fin.

1

Funcionalmente es equivalente a while(true) { }.

La razón por la sintaxis for(;;) se prefiere a veces proviene de una edad más avanzada, donde for(;;) realidad compilado a un código de máquina ligeramente más rápido que while(TRUE) {}. Esto se debe a for(;;) { foo(); } se traducirá en la primera pasada del compilador:

lbl_while_condition: 
    mov $t1, 1 
    cmp $t1, 0 
    jnz _exit_while 
lbl_block: 
    call _foo 
    jmp lbl_while_condition 

mientras que el for(;;) compile en la primera pasada a:

lbl_for_init: 
    ; do nothing 
lbl_for_condition: 
    ; always 
lbl_for_block: 
    call foo; 
lbl_for_iterate: 
    ; no iterate 
    jmp lbl_for_condition 

es decir

lbl_for_ever: 
    call foo 
    jmp lbl_for_ever 

Por lo tanto el ahorro 3 instrucciones en cada pasada del ciclo.

En la práctica, sin embargo, ambas declaraciones han desde hace mucho tiempo sido no sólo funcionalmente equivalente, sino también de hecho equivalente, ya que las optimizaciones en el compilador para todos construye aparte de versiones de depuración se asegurará de que el mov, cmp y jnz están optimizados distancia en el while(1) caso, lo que resulta en el código óptimo para for(;;) y while(1).