2011-01-31 1 views
17

Sono esperto di programmazione multithread in Java e C# e sto iniziando a imparare come farlo in C su Linux. Sono "cresciuto" in senso programmatico su Linux, quindi capisco che è la filosofia della memoria, la gestione dei processi, ecc. Ad alto livello.Come funziona il pthread?

La mia domanda non è come fare il threading. Mi piacerebbe sapere come lo fa effettivamente pthread. In qualche modo impegna un processo e gestisce la comunicazione dell'interprete? O gestisce solo lo spazio degli indirizzi? Voglio dettagli nitidissimi :) Googling ha prodotto solo domande "come farlo", non "come funziona".

risposta

9

Su Linux, sia fork() e ptrheads utilizzano lo stesso syscall clone(), che crea un nuovo processo. La differenza tra loro è semplicemente i parametri che inviano a clone(), quando si crea un nuovo thread, semplicemente fa in modo che entrambi i processi utilizzino gli stessi mapping di memoria.

Ricordate, in Linux (e in altri moderni Unix), mappature di memoria, stack, stato del processore, PID e altri sono caratteristiche ortogonali di un processo; così puoi creare un nuovo processo con solo un nuovo stack e lo stato del processo (condividendo tutto il resto) e chiamarlo thread.

+2

C'è un'altra cosa che un thread non può condividere - il valore 'TID'. – caf

4

Here è la fonte di pthread.c. Questo potrebbe aiutarti a rispondere alla tua domanda.

+0

Questa è l'implementazione di pthread di Windows, non l'implementazione di Linux. – Victor

12

I dettagli sono probabilmente troppo complesse per entrare davvero nella (senza pubblicazione di un link al codice sorgente glibc), ma può dare di meglio da guardare in alto:

  1. Pthread utilizza sys_clone() per creare nuova thread, che il kernel vede come una nuova attività che capita di condividere molte strutture di dati con altri thread.

  2. Per eseguire la sincronizzazione, pthread fa molto affidamento su futexes nel kernel.

+0

+1: aggiungendo semplicemente che 'fork()' usa lo stesso syscall ma la nuova attività condivide meno strutture con il genitore. – Javier