Wątki udostępniają wszystko [1]. Dla całego procesu istnieje jedna przestrzeń adresowa.
Każdy wątek ma swój własny stos i rejestry, ale wszystkie stosy wątków są widoczne we wspólnej przestrzeni adresowej.
Jeśli jeden wątek przydzieli jakiś obiekt na stosie i wyśle adres do innego wątku, oba będą miały równy dostęp do tego obiektu.
W rzeczywistości, po prostu zauważyłem szerszy problem: Myślę, że mylące dwa zastosowania tego słowa segmencie .
Format pliku wykonywalnego (np. ELF) zawiera odrębne sekcje, które można nazwać segmentami, zawierającymi skompilowany kod (tekst), zainicjowane dane, symbole linkera, informacje debugowania itp. Nie ma segmentów sterty lub stosu tutaj, ponieważ są to konstrukcje tylko do uruchamiania.
Te segmenty plików binarnych mogą być mapowane osobno w przestrzeni adresowej procesu, z różnymi uprawnieniami (np. Plik wykonywalny tylko do odczytu dla kodu / tekstu i plik wykonywalny kopiowania przy zapisie dla danych inicjowanych).
Obszary tej przestrzeni adresowej są wykorzystywane do różnych celów, takich jak alokacja sterty i stosy wątków, zgodnie z konwencją (wymuszoną przez biblioteki środowiska wykonawczego języka). To wszystko jest tylko pamięć i prawdopodobnie nie jest podzielona na segmenty, chyba że pracujesz w trybie wirtualnym 8086. Stos każdego wątku jest fragmentem pamięci przydzielanej podczas tworzenia wątku, przy czym bieżący górny adres stosu jest przechowywany w rejestrze wskaźnika stosu, a każdy wątek utrzymuje swój własny wskaźnik stosu wraz z innymi rejestrami.
[1] OK, wiem: maski sygnałów, TSS / TSD itp. Przestrzeń adresowa, w tym wszystkie jej zmapowane segmenty programu, są jednak nadal współdzielone.