我正在开发一个项目,我们通过C++/CLI层混合.NET代码和本机C++代码.在此解决方案中,我想通过__declspec(线程)声明使用线程本地存储:
__declspec(thread) int lastId = 0;
但是,在第一次访问变量时,我得到一个NullReferenceException.更确切地说,声明是在ref类(在C++/CLI中实现的.NET类)中完成的.
我已经阅读了一些关于__declspec(线程)的内容与延迟加载的DLL不兼容.如果我使用.NET,我是否自动使用延迟加载的DLL?
看来CLR不支持 __declspec(thread).
请记住,.net线程不是必需的本机线程,但也可以是光纤,因此线程的标准API不适用于它们.
如果您有托管类,则应使用托管线程API进行线程本地存储.
关于这种差异有很多文章.这只是为了让你开始.
作为提示:您可以使用ThreadStatic属性而不是TLS来提高性能.如果您使用的是ASP.NET应用程序,则需要记住有关TLS的一些内容.