Реализация локального хранилища потоков в Linux
__thread Foo foo;
Как на самом деле разрешается "foo"? Заменяет ли компилятор каждый экземпляр "foo" на вызов функции? "Foo" хранится где-то относительно дна стека, и компилятор сохраняет это как "эй, для каждого потока, имеет это пространство около дна стека, а foo хранится как" смещение x от дна стека " "?
1 ответ
Это немного сложно ( этот документ объясняет это очень подробно), но в принципе ни того, ни другого. Вместо этого компилятор помещает специальный раздел.tdata в исполняемый файл, который содержит все локальные переменные потока. Во время выполнения создается новый раздел данных для каждого потока с копией данных в разделе (только для чтения) .tdata, а когда потоки переключаются во время выполнения, раздел также переключается автоматически.
Конечным результатом является то, что переменные __thread так же быстры, как и обычные переменные, и они также не занимают дополнительного стекового пространства.