TLS index в статических tls переменных - зачем?

Тема в разделе "WASM.WIN32", создана пользователем vladqq, 25 май 2009.

  1. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    хай всем

    такой вопрос
    в статической 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 и используется ли он вообще ?

    спасибо
     
  2. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    используется.
    в твоем случае равен нулю, т.к. для разных потоков ты тестил с одной переменной.
    для бОльшего количества и индекс будет расти. Смотри TlsSetValue, TlsGetValue.
     
  3. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    TlsSetValue, TlsGetValue тут вообще не при делах, это статический tls, а индекс это индекс tls таблицы. Вопрос в том почему он всегда == 0 и для чего он нужен (пишут в литературе что он увеличивается для каждого нового треда но на практике это не так).
     
  4. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    Чтоб было яснее что такое статический tls вот пример его использования:

    __declspec(thread) int tls_i = 1;

    ....

    tls_i = 2; //и тп
     
  5. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Неправильно значит тебя понял.
    Если для статической TLS, _tls_index индексирует модуль, к TLS-данным которого ты обращаешься.
    От тредов никак не зависит, меняй литературу :)
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Немного дополним:
    ...И, поскольку exe-модуль всегда будет являться первым модулем с tls, положенным в процесс, для него в переменную по адресу _tls_index всегда будет сохраняться нуль.
    Например, компилятор из msvs2008 вообще не использует _tls_index при обращении к tls-переменным в exe-файлах – он знает, что [_tls_index] == 0.
     
  7. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    Что именно будет являтся модулем с номером 1 ? Первая загруженная в процесс dll ?
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Индекс = 1 будет присвоен первой dll, имеющей статический TLS. Но статические TLS инициализируются только для статически загружаемых dll и соотв-но юзать их в dll MS вообще не рекомендует. Читай спецификацю PE (.tls section) - там все расписано
     
  9. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    сенкс всем откликнувшимся