在c++11中,类中的静态成员变量是否能跨线程边界正常工作?DLL边界呢?
这是一个粗略的课堂剪辑,让我不禁要问:
class IndexedEvent
{
public:
//constructor that is used the very first time an
//instance of this class is constructed
IndexedEvent(Event* ev, int res):point(ev),resolution(res){calculateIndex();}
//constructor to be used every time after that
IndexedEvent(Event* ev):point(ev){calculateIndex();}
...some more member functions...
private:
...some more member functions...
static int resolution;
Event* point;
Index calcIndex;
}
如果我在程序执行的一开始就在中设置解析,其他线程是否能够创建正确设置了该值的IndexedEvent实例?导入的dll中的函数是否能够创建正确设置分辨率的实例?
如果这不起作用,或者由于需要跳过的障碍而不可行,是否可以通过为IndexedEvent创建一个工厂类来解决这个问题,而不是通过运算符new创建这个类的新实例,而是通过调用工厂类来创建它们?
所有线程的静态变量都将位于同一地址。
我建议将静态变量放在DLL中的静态函数中。静态函数返回对静态变量的引用。通过这种方式,您可以控制它的初始化,其他模块也可以轻松访问它。
使用thread_local
为每个线程提供变量的本地存储。