可以使用thread_local在每个线程的dll中提供静态全局变量吗?

Ide*_*ent 6 c++ dll c++11

我想在我们的开源库中使用C++ 11关键字thread_local,它可以在静态变量的上下文中在许多平台(Windows,Linux,Mac OS,...)上动态或静态链接.这个变量是一个类类型,它基本上只是封装了一个std :: stringstream变量并初始化它以适应我们的字符串流格式要求.出于性能原因,我们希望将此静态提供(有关更多详细信息,请参阅我之前的问题),如果每个线程完成此操作,则可以.

全局变量应该用在静态模板化类方法中,这些方法必须在头文件中实现.但是,如果我理解正确的话,这意味着库的用户可以在他们的可执行代码中包含这个头,这会将模板化的方法编译成可执行文件.然后,这些方法将从可执行文件的线程中访问提到的全局变量.我如何声明/定义静态变量才能工作,即我需要导出变量或类类型还是足以将其声明为"static thread_local X"?这是我目前的声明:

// SharedStringstream.h
#include <sstream>
// Export stands for _declspec(dllimport) or (dllexport) respectively
class EXPORT SharedStringstream
{
public:
    SharedStringstream();

    static thread_local SharedStringstream s_sharedStreamInstance;

    std::stringstream d_sharedStream;
};
Run Code Online (Sandbox Code Playgroud)

和定义:

// SharedStringstream.cpp
#include "SharedStringStream.h"

SharedStringstream SharedStringstream::s_sharedStreamInstance();

SharedStringstream::SharedStringstream()
{
    d_sharedStream.imbue(std::locale("C"));
    d_sharedStream << std::skipws;
    d_sharedStream >> std::skipws;
}
Run Code Online (Sandbox Code Playgroud)

没有导出我得到链接器错误,我在Visual Studio 2015中收到以下错误:

错误C2492'public:static SharedStringstream SharedStringstream :: s_sharedStreamInstance':具有线程存储持续时间的数据可能没有dll接口

这里给出更多信息,其中基本上表明thread_local可能不会导出变量.为此,我必须将它从类中移出到我的命名空间中,这是唯一的方法吗?

此外:"线程本地存储"上的MSDN页面说明以下关于thread_local和DLL:

thread属性的使用可能会干扰DLL导入的延迟加载.

我们在内部使用DLL的延迟加载来处理我们的库所包含的一些插件,但是不会对该变量进行任何调用.我假设用户可以延迟加载库,尽管我们没有正式支持这个.假设我们不支持延迟加载我们的库并且不在内部调用任何延迟加载的dll中的变量,我们是否能够确定这在任何上下文中都不会成为问题?

我的问题中没有考虑过任何问题吗?

小智 -1

当 dll 加载时,它会加载自己的内存模型。因此,任何静态代码都不会在不同进程之间共享。