在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创建工厂类来解决,而不是通过operator new创建此类的新实例,创建它们打电话给工厂班?
答案 0 :(得分:1)
静态变量将位于所有线程的相同地址。
我建议将静态变量放在DLL中的静态函数中。 static函数返回对静态变量的引用。这样您就可以控制其初始化,其他模块可以轻松访问它。
使用thread_local
为每个线程提供变量的本地存储。