Реализация локального хранилища потоков в Linux - PullRequest
28 голосов
/ 17 марта 2010
__thread Foo foo;

Как на самом деле разрешается "foo"? Заменяет ли компилятор каждый экземпляр "foo" вызовом функции? «Foo» хранится где-то относительно дна стека, и компилятор сохраняет это как «эй, для каждого потока, имеет это пространство около дна стека, а foo сохраняется как« смещение x от дна стека » «

1 Ответ

34 голосов
/ 17 марта 2010

Это немного сложно ( этот документ объясняет это очень подробно), но в принципе ни то, ни другое. Вместо этого компилятор помещает специальный раздел .tdata в исполняемый файл, который содержит все локальные переменные потока. Во время выполнения создается новый раздел данных для каждого потока с копией данных в разделе (только для чтения) .tdata, а когда потоки переключаются во время выполнения, этот раздел также переключается автоматически.

Конечным результатом является то, что переменные __thread так же быстры, как и обычные переменные, и они также не занимают дополнительного стекового пространства.

...