/ / Il multi-threading in C non funziona sul processore single-core? - c, multithreading

Multi-threading in C non funziona su un processore single-core? - c, multithreading

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 № 1

Devi 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).