PDA

View Full Version : [C] printf - single Thread e multi Thread


nico88desmo
20-12-2010, 16:11
Ciao a tutti!

Mi sono imbattuto in un problema riguardante la funzione printf() in C sotto ambiente linux.
Il problema è il seguente; Considerando la seguente istruzione:
printf("ciao");

single-Thread: quando faccio la printf, questa viene immediatamente visualizzata sul terminale;
multi-Thread: quando faccio la printf in ciascun thread, la visualizzazione dei caratteri nel terminale avviene solamente quando il buffer stdout si è riempito completamente; se invece aggiungo il carattere \n nella printf - printf("ciao\n") - in questo modo la stampa a video avviene immediatamente;


Qualcuno sa spiegarmi il motivo?

Grazie in anticipo!

tuccio`
20-12-2010, 18:23
in genere printf fa un flush ogni volta che riceve un carattere newline o quando è necessario (ad esempio il buffer è pieno, o l'applicazione sta per terminare o stai per fare una lettura da tastiera)

non sono sicuro che questo comportamento sia standard, comunque se il buffering è un problema puoi sempre eliminarlo con
setbuf(stdout, NULL);

ps: comunque non credo la printf sia thread safe

nico88desmo
22-12-2010, 10:07
Da quanto ho letto la printf non è thread-safe.

Il dubbio è nato in quanto ho pensato che anche facendo un ciclo for piuttosto grande, al cui interno faccio la printf senza il carattere newline, teoricamente non dovrebbe stampare nulla finchè o appunto il buffer è pieno oppure fintanto che il ciclo non sia terminato.

Invece, con questa porzione di codice per esempio

int i=0;
for (i=0; i<1000000000; i++) {
printf("ciao");
}


la stampa della stringa "ciao" avviene ad ogni ciclo.

L'unica spiegazione plausibile è che la printf non è thread-safe, per cui ha un comportamento anomalo.