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 возвращает нужные адреса экспортируемых функций... Что же тогда поломается?
Здравствуйте, 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)
Здравствуйте, tarkil, Вы писали:
T>Точно? Т.е., работать будет так, будто модификатора этого нету?
Не знаю точно. Может, как будто нету, может при попытке обратиться к переменной выдаст Access Violation... Я точно не знаю, как реализован __declspec(thread), поэтому сказать не могу.
Здравствуйте, tarkil, Вы писали:
T>Здравствуйте, SergH, Вы писали:
T>>>Что же тогда поломается? SH>>Поломается _declspec(thread)
T>Точно? Т.е., работать будет так, будто модификатора этого нету?
поломается, это не значит, что будет работать так-то или так-то. В общем случае произвольное поведение.
быстрей всего все переменные tls могут перемешаться.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>поломается использование переменных объявленных с __declspec(thread)
Эксперимент показывает, что при обращении к такой переменной возникает AV. При это библиотека должна быть "чисто" динамическая. Для библиотек, загруженных статически и хэндл которых потом просто получен ч/з LoadLibrary всё ОК.
Здравствуйте, SergH, Вы писали:
SH>Не знаю точно. Может, как будто нету, может при попытке обратиться к переменной выдаст Access Violation... Я точно не знаю, как реализован __declspec(thread), поэтому сказать не могу.
Я проверил — AV. Но важен факт первой загрузки, т.е. если изначально dll загружена статически, то потом LoadLibrary можно спокойно использовать. Хм... А с отложенной загрузкой, интересно, будет работать?
Здравствуйте, tarkil, Вы писали:
T>Я проверил — AV.
А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно
T>Но важен факт первой загрузки, т.е. если изначально dll загружена статически, то потом LoadLibrary можно спокойно использовать.
Это понятно. При загрузке таких dll загрузчик что-то делает... Не знаю что, но получается это у него только если грузить их неявно.
T>Хм... А с отложенной загрузкой, интересно, будет работать?
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.
Здравствуйте, SergH, Вы писали:
SH>А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно
Не стал я гонять под отладчиком, зато набросал библиотечку (состоящую из одного хидера ), которая вручную реализует механизм, аналогичный __declspec(thread). Брать здесь.
Только под Винды. Описание прямо внутри файла. Любые комментарии, в том числе и грязно-ругательные приветствуются.
Здравствуйте, tarkil, Вы писали:
T>Здравствуйте, SergH, Вы писали:
SH>>А посмотри под отладчиком, что там происходит при обращении к такой переменной. Срразу на все вопросы ответ получишь И сюда запостить не забудь, всем интересно
T>Не стал я гонять под отладчиком, зато набросал библиотечку (состоящую из одного хидера ), которая вручную реализует механизм, аналогичный __declspec(thread). Брать здесь.
T>Только под Винды. Описание прямо внутри файла. Любые комментарии, в том числе и грязно-ругательные приветствуются.
Кинь в форум "Исходники" (ветка "Проекты"). И, если файл не очень большой, лучше его вечь в форум.