Scrivo un programma utilizzando pthread
.output strano quando uso pthread e printf
Ambiente: Windows 7, CYGWIN_NT-i686 6.1 Cygwin, gcc (GCC) 4.5.3
Il codice sorgente
#include<stdio.h>
#include<pthread.h>
void *th_func(void *p)
{
int iLoop = 0;
for(iLoop = 0;iLoop<100;iLoop++)
{
printf("Thread Thread Thread Thread\n");
}
return;
}
int main()
{
int iLoop = 0;
pthread_t QueThread;
printf("Main : Start Main\n");
printf("Main : Start Create Thread\n");
pthread_create(&QueThread,NULL,th_func,NULL);
printf("Main : End Create Thread\n");
for(iLoop = 0;iLoop<100;iLoop++)
{
printf("Main Main Main Main\n");
}
pthread_join(QueThread,NULL);
printf("Main : End Main\n");
printf("---------------\n");
return 0;
}
Quando compilo il codice sorgente, non ci sono avvisi o errori, ma è l'output è strano.
Una parte di esso è uscita
Main : Start Main
Main : Start Create Thread
Thread Thread Thread ThreThread Thread Thread Thread
Main Main Main Main
Thread Thread Thread Thread
Main Main Main Main
Voglio sapere la causa di tale fenomeno.
In questa uscita, Main : End Create Thread
non viene stampato completamente. E alla riga 3 sparisce una nuova riga \n
alla fine di "Thread Thread Thread Thread\n"
.
L'output di tutti è simile a questo? Non si verifica ogni volta, ma si verifica a volte.
Se utilizzo il mutex per chiamare printf
in modo sicuro, l'output strano sembra essere arrestato.
POSIX dice che printf
è thread-safe, e secondo Cygwin.com, cygwin fornisce API in stile posix. Tuttavia, c'è l'uscita inaspettata.
È printf
veramente thread-safe?
Ho eseguito lo stesso programma 100 volte in Linux (Ubuntu) e questo output non si è verificato.
Inoltre, non ho capito il motivo per cui alcune parole sull'output sono scomparse.
Si vedono solo due thread in uscita intercalati. – CCoder
Thread-safe non significa che sia atomico. – Barmar
Questa domanda non ha nulla a che fare con il duplicato identificato. Questa ricerca riguarda specificatamente se POSIX specifica che 'printf()' dovrebbe essere atomico tra i thread in un processo. Il duplicato identificato riguarda la pianificazione generale dei thread e le condizioni di gara. –