【问题标题】:Do the values of static variables transfer across thread boundaries properly? What about DLL boundaries?静态变量的值是否正确地跨线程边界传输? DLL 边界呢?
【发布时间】:2013-08-16 19:07:50
【问题描述】:

在 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 创建此类的新实例来解决它,创建它们调用工厂类?

【问题讨论】:

  • 定义“正常工作”。
  • @Casey:正如我在底部所说的那样,在其他线程中创建的类的实例,或者在 DLL 中的函数中创建的类的实例仍然共享相同的值吗?

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


【解决方案1】:

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

我建议将静态变量放在 DLL 内的静态函数中。静态函数返回对静态变量的引用。这样你可以控制它的初始化并且其他模块可以很容易地访问它。

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

【讨论】:

  • 这回答了我的部分问题,尽管在 DLL 中放置一些东西是不可能的。 DLL 是其他人编写的插件,允许我的代码使用新的原始数据格式或不同类型的数据运行。所以我的代码存在于可执行文件中,我希望他们的代码能够创建此类的实例并看到静态成员的相同值。
  • 很高兴这只是回答了我问题的第二部分。 stackoverflow.com/questions/4911994/… 所以我想我需要找到另一种方法。感谢您的帮助。
猜你喜欢
  • 2018-12-24
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多