Quindi ho appena preso l'esempio da questo sito web e dice che l'output dovrebbe alternarsi così:
threadFunc dice: elaborazione ... main () è in esecuzione ... threadFunc dice: elaborazione ... main () è in esecuzione ...
Tuttavia sulla mia macchina produce questo:
threadFunc dice: elaborazione ... threadFunc dice: elaborazione ... main () è in esecuzione ... main () è in esecuzione ...
È perché ho un processore single-core che non è multithread?
Nota: Ricevo anche questo avviso durante la compilazione: implicit declaration of function ‘usleep’
Sto compilando con gcc in questo modo: gcc new.c -o new -lpthread
risposte:
3 per risposta № 1Devi commentare la riga:
pthread_join(pth, NULL /* void ** return value could go here */);
In questo modo lo farà funzionare come previsto
Quello che sta facendo è far aspettare il thread fino al thread pth
è terminato prima di procedere.
3 per risposta № 2
No. L'ordine dell'output di due thread che scrivono contemporaneamente nello stesso posto non è ben definito e dipende da molti fattori. Il primo thread potrebbe essere iniziato prima del secondo e potrebbe aver completato il suo lavoro prima che il secondo avesse anche la possibilità di avviarsi. Un'altra opzione è che l'output è bufferizzato in qualche modo nel thread e viene scaricato solo dopo aver raggiunto una determinata soglia.
Tutto ciò non ha nulla a che vedere con il fatto che il tuo processore è un singolo core. Il multi-threading funzionava bene prima che i processori multi core fossero concepiti.
Se vuoi interfogliare l'output nel modo in cui descrivi, dovrai utilizzare un meccanismo di sincronizzazione come una sezione critica o un mutex.
1 per risposta № 3
No, l'uso di usleep
non è un modo garantito per riprogrammare il thread. Nemmeno sched_yield
farà necessariamente qualsiasi cosa. Se è necessario disporre di un'esecuzione alternativa, è necessario utilizzare una variabile di condizione o un altro meccanismo di segnalazione. Notare che usare semplicemente un mutex non lo farà neanche, dal momento che non necessariamente riprogrammare.
0 per risposta № 4
Dovrebbe comunque essere eseguito correttamente il multithread; prova a giocare con il numero di iterazioni di loop e / o il tempo nel usleep()
chiamate. Forse il tuo scheduler si comporta in modo diverso o il buffer di output sul tuo sistema è diverso.
0 per risposta № 5
Cosa si sta facendo in quei thread? Una CPU single core dovrebbe multiproprietà (scambiare) l'esecuzione dei thread. Questo dipende dal tuo sistema operativo e da come funziona lo scheduler (e se dormi o meno il thread).
0 per risposta № 6
Il multi-threading non è direttamente correlato al numero di core su una macchina: è possibile implementare molto bene il multi-threading su un singolo processore.
L'output che stai vedendo è probabilmente solo correlato al modo in cui i thread sono interlacciati dal thread del sistema operativo / scheduler del processo (non ho seguito il link al sito a cui stai facendo riferimento).