Lo stack per thread diversi è diverso.ma che dire di heap. Se Heap è diverso per i diversi thread, allora come condividono gli oggetti?
L'implementazione standard per i thread del sistema operativo è che condividono la stessa memoria (ad es. heap), codice, dati, handle delle risorse ecc. Il codice che utilizza questo tipo di threading può condividere oggetti (anche se dovresti chiedere "Come fanno condividere oggetti tranquillamente ? "). Tuttavia, alcune lingue (ad es. Erlang ) offrono una propria versione di thread che non hanno accesso alla memoria condivisa . In questi casi, non esiste uno stato condiviso e quindi nessun oggetto condiviso; questi costrutti comunicano con una qualche forma di passaggio di messaggi .
AFAICR, per un nuovo thread spazio utente, lo spazio dello stack viene allocato nella memoria virtuale dal sistema operativo utilizzando il lato kernel di ZwAllocateVirtualMemory () routine . Il puntatore dello stack per il thread è impostato all'inizio di questo blocco e viene avviata la procedura del thread (tra alcune altre impostazioni, omessa qui).
Quando il thread deve allocare dinamicamente l'heap, potrebbe utilizzare "new", "malloc ()" o GlobalAlloc (), che passano tutti attraverso l'API nativa " RtlAllocateHeap () 'che verrà allocata da un heap del processo . Poiché ci saranno più thread, ciò deve essere sicuro per i thread (per impostazione predefinita è presente un flag di disattivazione delle opzioni).
Una volta che la memoria è allocata nell'heap, qualsiasi thread è libero di fare ciò che vuole con esso - non ci sono blocchi applicati dal sistema operativo. È compito della lingua / runtime serializzare l'accesso all'oggetto se lo si desidera. Alcune lingue hanno questo built-in (ad esempio ' synchronized '), per altri è tutto manuale.
Leggi altre domande sui tag operating-systems windows multithreading