2010-01-02 14 views
14

Trovato in Torvalds/linux-2.6.git -> linea del kernel/mutex.c 171Che tipo di loop è per (;;)?

ho cercato di trovare su Google e quali senza alcun risultato.

Cosa insegna for (;;)?

+32

non è un commento utile. Solo perché konman non è molto esperto in C non significa che non possano leggere i file di codice. E ora hanno imparato qualcosa, quindi è una buona cosa. –

+10

Sono d'accordo con Alastair. Leggere la fonte scritta da altri è un ottimo modo per imparare. – CesarGon

+20

Se non sei esperto in c, leggi il codice del kernel. –

risposta

20

Il simbolo for (;;) è una condizione di ciclo infinito, simile a while (1) come la maggior parte ha già menzionato. Lo si vedrebbe più spesso, nei codici mutex del kernel o mutex, ad es. Problemi come i filosofi che mangiano. Fino a quando la variabile mutex non viene impostata su un valore particolare, in modo tale che un secondo processo acceda alla risorsa, il secondo processo continua a scorrere, noto anche come attesa attenta. L'accesso a una risorsa può essere l'accesso al disco, per il quale 2 processi sono in competizione per ottenere l'accesso utilizzando un mutex tale che in un momento solo un processo ha accesso alla risorsa.

+1

I loop infiniti e le attese occupate sono cose diverse. Un'attesa indaffarata è un ciclo * insonne * in attesa di qualche condizione - nulla di infinito a riguardo. –

+2

@Jim, per essere onesti, nessun ciclo è infinito in quanto potresti perdere energia in qualsiasi momento o la tua macchina morirà di vecchiaia. Sta parlando di chiedere al compilatore un ciclo senza condizioni finali piuttosto che qualcosa di infinito. – Blindy

+1

@Blindy Modo di perdere il punto ed essere assurdamente pedante allo stesso tempo. Come duh, non sapevo della morte termica dell'universo. Nel frattempo, * busy * wait sono, come ho detto, insonni, * e * hanno condizioni finali. –

46

Significa letteralmente "non fare nulla, finché non succede nulla e ad ogni passo, non fare nulla per preparare il prossimo". Fondamentalmente, si tratta di un ciclo infinito che dovrai interrompere in qualche modo dall'interno utilizzando una dichiarazione break, return o goto. .

+1

Pollice in alto per la velocità :) – Anna

5

E loop per sempre (fino a quando il codice all'interno del ciclo chiama break o return, naturalmente while(1) è equivalente, io personalmente trovo più logico utilizzare che

+1

Oppure chiama exit o longjmp o fa un goto fuori dal loop, o (POSIX) finché non si verifica un segnale che non ritorna. Anche vari tipi di comportamento non definito possono terminare il loop, oltre a vari eventi esterni oltre l'ambito del linguaggio C, incluso il rilascio di una nuke sul computer su cui è in esecuzione il programma. –

4

E 'equivalente a while(true)

Edit.: Dal momento che c'è stata qualche discussione scatenata dalla mia risposta (buon dibattito, intendiamoci) dovrebbe essere chiarito che questo non è del tutto accurato per i programmi C non scritti in C99 e oltre in cui stdbool.h ha impostato il valore di true = 1.

+4

, a condizione che sia == 1. –

+12

Hanno bisogno di un sistema di downvoting dei commenti. – Blindy

+1

Hey amico, sta solo cercando di assicurarsi che le persone a prova di futuro le loro applicazioni contro la possibilità che il valore del cambiamento 'vero'. –

9

È un ciclo infinito che non ha condizione iniziale, nessuna condizione di incremento e nessuna condizione di fine. Quindi itererà per sempre equivalente a while (1).

+4

almeno un compilatore che conosco avviserà durante il (1) o il while (true) loops, ma "sa" di non produrre la diagnostica per (;;) poiché è considerato il modulo "standard" per il ciclo infinito. –

2

È come scrivere un ciclo infinito usando l'istruzione "for", ma è necessario usare break o qualche altra istruzione che può uscire da questo ciclo.

1

I significa:

#define EVER ;; 

for(EVER) 
{ 
    // do something 
} 

Attenzione: L'utilizzo di questo nel codice è altamente sconsigliato.

+6

Lo odio davvero quando vedo un codice come questo. L'autore ovviamente pensa che sia più chiaro, ma spesso devo tornare indietro e assicurarmi che MAI non sia definito come qualcosa di male che mi causerà dei problemi. – Fredrik

+0

Vero, non scriverei per (MAI) nel mio codice neanche. Questo è solo per divertimento :) – JCasso

+0

Infatti, non farlo nel codice reale. – Ree

0

Ovviamente era una condizione di ciclo infinito.

0

È un ciclo infinito che dovrai interrompere in qualche modo dall'interno utilizzando un'istruzione break, return o goto. o sia qualche interrupt accade altrimenti questo ciclo viene eseguito all'infinito ed esegue; (istruzione nulla) ogni volta

1

for (;;)

è un ciclo infinito come while(1). Qui non viene data alcuna condizione che interrompa il ciclo. Se non lo rompi usando la dichiarazione break questo ciclo non finirà mai.

1

È funzionalmente equivoco a while(true) { }.

Il motivo per cui la sintassi for(;;) è a volte preferito viene da un'età più avanzata in cui for(;;) in realtà redatto un codice macchina leggermente più veloce di while(TRUE) {}. Questo perché for(;;) { foo(); } tradurrà nel primo passaggio del compilatore:

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

mentre il for(;;) sarebbe compilazione nel primo passaggio:

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

cioè

lbl_for_ever: 
    call foo 
    jmp lbl_for_ever 

Quindi risparmio 3 istruzioni per ogni passaggio del ciclo.

In pratica, tuttavia, entrambe le istruzioni sono da tempo stata non solo funzionalmente equivalenti, ma anche in realtà equivalente poiché ottimizzazioni del compilatore per tutti build diversa di debug build farà in modo che il mov, cmp e jnz vengono ottimizzati via nel while(1) caso, con conseguente codice ottimale per entrambi for(;;) e while(1).