静态变量的值是否正确地跨线程边界传输? DLL边界怎么样?

时间:2013-08-16 19:07:50

标签: multithreading dll c++11 static-members

在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创建此类的新实例,创建它们打电话给工厂班?

1 个答案:

答案 0 :(得分:1)

静态变量将位于所有线程的相同地址。

我建议将静态变量放在DLL中的静态函数中。 static函数返回对静态变量的引用。这样您就可以控制其初始化,其他模块可以轻松访问它。

使用thread_local为每个线程提供变量的本地存储。