Локальное хранилище потока с __declspec (thread) завершается неудачно в C ++ / CLI - PullRequest
5 голосов
/ 22 октября 2008

Я работаю над проектом, в котором мы смешиваем код .NET и собственный код C ++ через слой C ++ / CLI. В этом решении я хочу использовать Thread Local Storage через объявление __declspec (thread):

__declspec(thread) int lastId = 0;

Однако при первом доступе к переменной я получаю исключение NullReferenceException. Чтобы быть более точным, объявление выполняется в классе ref (класс .NET, реализованный в C ++ / CLI).

Я уже читал что-то о __declspec (поток) не работает с DLL с задержкой загрузки. Использую ли я DLL с задержкой загрузки автоматически, если я использую .NET?

Ответы [ 2 ]

6 голосов
/ 22 октября 2008

Кажется, что __declspec (thread) не поддерживается CLR .

Имейте в виду, что потоки .net не обязательно являются нативными, , но могут быть и волокнами , поэтому стандартные API для потоков не работают с ними.

Если у вас есть управляемый класс, вы должны использовать API управляемого потока для локального хранилища потока .

Есть много статей об этой разнице. Это только начало.

Как подсказка: Вы можете использовать атрибут ThreadStatic вместо TLS, чтобы улучшить производительность . Если вы работаете с приложениями ASP.NET, вам нужно запомнить некоторые вещи о TLS.

4 голосов
/ 22 октября 2008

К сожалению, не поддерживается. Вот запись в блоге с обходным путем:

http://blogs.msdn.com/jeremykuhne/archive/2006/04/19/578670.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...