Pamięć lokalna wątku dotyczy tylko zmiennych statycznych. Nie ma sensu, aby struktura niestatyczna lub członkowie klasy mieli wątek lokalny.
Zmienne lokalne (automatyczne) są zawsze specyficzne dla wątku, który wykonuje kod, ale globalne i statyczne zmienne są współużytkowane przez wątki, ponieważ znajdują się w segmencie danych lub BSS. TLS zapewnia mechanizm, dzięki któremu te globalne zmienne są lokalne dla wątku i to właśnie osiąga słowo __thread
- instruuje kompilator, aby utworzył osobną kopię zmiennej w każdym wątku, podczas gdy leksykalnie pozostaje globalnym (np. Można uzyskać do niego dostęp przez różne funkcje wywoływane w ramach tego samego wątku wykonywania).
Niestateczne klasy i elementy konstrukcyjne są umieszczane w tym samym miejscu, w którym obiekt (klasa lub struktura) jest alokowany - na stosie, jeśli zadeklarowana jest zmienna automatyczna lub w sterty, jeśli użyto new
lub malloc()
. Tak czy inaczej, każdy wątek otrzymuje unikalne miejsce do przechowywania zmiennej, a __thread
po prostu nie ma zastosowania w tym przypadku, stąd pojawia się błąd kompilatora.
Proszę opublikować błąd kompilatora dostajesz. –
AFAICS '__thread' nie jest standardem. Który kompilator używasz? –