хай всем такой вопрос в статической tls все данные хранятся в буфере, который отдельно выделяется для каждого потока. при обращении к переменной генерится такой код: mov ecx, [_tls_index] // Индекс mov edx, fs:[2Ch] // В EDX - адрес массива TLS - ThreadLocalStorage mov eax, [edx+ecx*4]// В EAX - адрес буфера специфичного для потока mov [eax+104h],1 // 104h - смещение переменно поигравшись немного с отладчиком я увидел, что этот _tls_index всегда равен нулю, даже для разных тредов (при этом fs:[2ch] разные). вопрос - какой смысл в этом _tls_index и используется ли он вообще ? спасибо
используется. в твоем случае равен нулю, т.к. для разных потоков ты тестил с одной переменной. для бОльшего количества и индекс будет расти. Смотри TlsSetValue, TlsGetValue.
TlsSetValue, TlsGetValue тут вообще не при делах, это статический tls, а индекс это индекс tls таблицы. Вопрос в том почему он всегда == 0 и для чего он нужен (пишут в литературе что он увеличивается для каждого нового треда но на практике это не так).
Чтоб было яснее что такое статический tls вот пример его использования: __declspec(thread) int tls_i = 1; .... tls_i = 2; //и тп
Неправильно значит тебя понял. Если для статической TLS, _tls_index индексирует модуль, к TLS-данным которого ты обращаешься. От тредов никак не зависит, меняй литературу
Немного дополним: ...И, поскольку exe-модуль всегда будет являться первым модулем с tls, положенным в процесс, для него в переменную по адресу _tls_index всегда будет сохраняться нуль. Например, компилятор из msvs2008 вообще не использует _tls_index при обращении к tls-переменным в exe-файлах – он знает, что [_tls_index] == 0.
Индекс = 1 будет присвоен первой dll, имеющей статический TLS. Но статические TLS инициализируются только для статически загружаемых dll и соотв-но юзать их в dll MS вообще не рекомендует. Читай спецификацю PE (.tls section) - там все расписано