LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 24.02.05 10:16
Оценка:
Добрый день!

Отыскал в MSDN такой интересный пассаж.

LoadLibrary
The Visual C++ compiler supports a syntax that enables you to declare thread-local variables: _declspec(thread). If you use this syntax in a DLL, you will not be able to load the DLL explicitly using LoadLibrary or LoadLibraryEx. If your DLL will be loaded explicitly, you must use the thread local storage functions instead of _declspec(thread).


А теперь, господа, скажите, а чем грозит вызов LoadLibrary для dll'ки, у которой есть-таки переменные _declspec(thread)? Тестовый проект показал, что LoadLibrary нормально грузит библиотеку и GetProcAddress возвращает нужные адреса экспортируемых функций... Что же тогда поломается?
--
wbr, Peter Taran
Re: LoadLibrary и __declspec(thread)
От: SergH Россия  
Дата: 24.02.05 10:19
Оценка: 2 (1)
Здравствуйте, tarkil, Вы писали:

T>Что же тогда поломается?


Поломается _declspec(thread)
Делай что должно, и будь что будет
Re: LoadLibrary и __declspec(thread)
От: Сергей Мухин Россия  
Дата: 24.02.05 10:23
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Добрый день!


T>Отыскал в MSDN такой интересный пассаж.


T>

T>LoadLibrary
T>The Visual C++ compiler supports a syntax that enables you to declare thread-local variables: _declspec(thread). If you use this syntax in a DLL, you will not be able to load the DLL explicitly using LoadLibrary or LoadLibraryEx. If your DLL will be loaded explicitly, you must use the thread local storage functions instead of _declspec(thread).


T>А теперь, господа, скажите, а чем грозит вызов LoadLibrary для dll'ки, у которой есть-таки переменные _declspec(thread)? Тестовый проект показал, что LoadLibrary нормально грузит библиотеку и GetProcAddress возвращает нужные адреса экспортируемых функций... Что же тогда поломается?



поломается использование переменных объявленных с __declspec(thread)
---
С уважением,
Сергей Мухин
Re[2]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 24.02.05 10:31
Оценка:
Здравствуйте, SergH, Вы писали:

T>>Что же тогда поломается?

SH>Поломается _declspec(thread)

Точно? Т.е., работать будет так, будто модификатора этого нету?
--
wbr, Peter Taran
Re[3]: LoadLibrary и __declspec(thread)
От: SergH Россия  
Дата: 24.02.05 10:34
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Точно? Т.е., работать будет так, будто модификатора этого нету?


Не знаю точно. Может, как будто нету, может при попытке обратиться к переменной выдаст Access Violation... Я точно не знаю, как реализован __declspec(thread), поэтому сказать не могу.
Делай что должно, и будь что будет
Re[3]: LoadLibrary и __declspec(thread)
От: Сергей Мухин Россия  
Дата: 24.02.05 10:35
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Здравствуйте, SergH, Вы писали:


T>>>Что же тогда поломается?

SH>>Поломается _declspec(thread)

T>Точно? Т.е., работать будет так, будто модификатора этого нету?


поломается, это не значит, что будет работать так-то или так-то. В общем случае произвольное поведение.
быстрей всего все переменные tls могут перемешаться.
---
С уважением,
Сергей Мухин
Re[2]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 24.02.05 10:51
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>поломается использование переменных объявленных с __declspec(thread)


Эксперимент показывает, что при обращении к такой переменной возникает AV. При это библиотека должна быть "чисто" динамическая. Для библиотек, загруженных статически и хэндл которых потом просто получен ч/з LoadLibrary всё ОК.
--
wbr, Peter Taran
Re[4]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 24.02.05 10:57
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Не знаю точно. Может, как будто нету, может при попытке обратиться к переменной выдаст Access Violation... Я точно не знаю, как реализован __declspec(thread), поэтому сказать не могу.


Я проверил — AV. Но важен факт первой загрузки, т.е. если изначально dll загружена статически, то потом LoadLibrary можно спокойно использовать. Хм... А с отложенной загрузкой, интересно, будет работать?
--
wbr, Peter Taran
Re[5]: LoadLibrary и __declspec(thread)
От: SergH Россия  
Дата: 24.02.05 11:01
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Я проверил — AV.


А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно

T>Но важен факт первой загрузки, т.е. если изначально dll загружена статически, то потом LoadLibrary можно спокойно использовать.


Это понятно. При загрузке таких dll загрузчик что-то делает... Не знаю что, но получается это у него только если грузить их неявно.

T>Хм... А с отложенной загрузкой, интересно, будет работать?


Сомневаюсь.
Делай что должно, и будь что будет
Re[5]: LoadLibrary и __declspec(thread)
От: Polonius Россия  
Дата: 25.02.05 10:05
Оценка: 4 (1)
Здравствуйте, tarkil, Вы писали:

Возможно вот это прояснит ситуацию :

MSDN
Rules and Limitations for TLS

If a DLL declares any nonlocal data or object as __declspec( thread ), it can cause a protection fault if dynamically loaded. After the DLL is loaded with LoadLibrary, it causes system failure whenever the code references the nonlocal __declspec( thread ) data. Because the global variable space for a thread is allocated at run time, the size of this space is based on a calculation of the requirements of the application plus the requirements of all of the DLLs that are statically linked. When you use LoadLibrary, there is no way to extend this space to allow for the thread local variables declared with __declspec( thread ). Use the TLS APIs, such as TlsAlloc, in your DLL to allocate TLS if the DLL might be loaded with LoadLibrary.

Дайте мне точку входа, и я переверну мир.
Re[6]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 25.02.05 10:44
Оценка:
Здравствуйте, SergH, Вы писали:

SH>А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно


Не стал я гонять под отладчиком, зато набросал библиотечку (состоящую из одного хидера ), которая вручную реализует механизм, аналогичный __declspec(thread). Брать здесь.

Только под Винды. Описание прямо внутри файла. Любые комментарии, в том числе и грязно-ругательные приветствуются.
--
wbr, Peter Taran
Re[7]: LoadLibrary и __declspec(thread)
От: SergH Россия  
Дата: 25.02.05 11:14
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Здравствуйте, SergH, Вы писали:


SH>>А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно


T>Не стал я гонять под отладчиком, зато набросал библиотечку (состоящую из одного хидера ), которая вручную реализует механизм, аналогичный __declspec(thread). Брать здесь.


T>Только под Винды. Описание прямо внутри файла. Любые комментарии, в том числе и грязно-ругательные приветствуются.


Кинь в форум "Исходники" (ветка "Проекты"). И, если файл не очень большой, лучше его вечь в форум.
Делай что должно, и будь что будет
Re[6]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 04.03.05 10:15
Оценка:
Здравствуйте, Polonius, Вы писали:

P>Возможно вот это прояснит ситуацию :


P>MSDN

P>Rules and Limitations for TLS
P>

P>...


В точку. Именно о нём речь.
--
wbr, Peter Taran
Re[8]: LoadLibrary и __declspec(thread)
От: tarkil Россия http://5209.copi.ru/
Дата: 04.03.05 10:17
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Кинь в форум "Исходники" (ветка "Проекты"). И, если файл не очень большой, лучше его вечь в форум.


Уф. Вернулся из златоглавой. Сейчас, я думаю ещё напильником его дорихтовать, чтоб можно было и конструктор вызывать и тогда уже кину.
--
wbr, Peter Taran
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.