6

我正在做一个项目,我们通过 C++/CLI 层混合 .NET 代码和本机 C++ 代码。在这个解决方案中,我想通过 __declspec(thread) 声明使用线程本地存储:

__declspec(thread) int lastId = 0;

但是,在第一次访问该变量时,我得到了 NullReferenceException。更准确地说,声明是在ref 类(在 C++/CLI 中实现的 .NET 类)中完成的。

我已经阅读了一些关于 __declspec(thread) 不适用于延迟加载的 DLL 的内容。如果我使用 .NET,我是否会自动使用延迟加载的 DLL?

4

2 回答 2

6

似乎CLR 不支持__declspec(thread) 。

请记住,.net 线程不一定是本机线程,但也可以是 fiber,因此线程的标准 API 不适用于它们。

如果你有一个托管类,那么你应该使用托管线程 API 的线程本地存储

有很多关于这种差异的文章。这只是为了让你开始。

提示:您可以使用 ThreadStatic 属性而不是 TLS 来提高性能。如果您正在使用 ASP.NET 应用程序,您需要记住一些关于 TLS 的事情。

于 2008-10-22T08:05:53.317 回答
4

很遗憾不支持。这是一个带有解决方法的博客条目:

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

于 2008-10-22T08:09:43.247 回答