从dll导入的类的线程安全性

时间:2011-09-07 15:30:51

标签: c++ dll thread-safety shared-libraries

我有一个导出接口的dll

class Qwe{
    virtual void a() = 0;
    virtual void b() = 0;
};

extern "C" Qwe* createQwe();

我将它加载到我的程序中并创建多个Qwe对象。问题是从不同线程访问这些对象是否安全?我应该为每个对象打开新的库实例,还是一个就够了?

不使用静态数据成员,库函数本身不是线程安全的。

更好地定义问题...导出的类可能看起来像这样

class QweImpl : public Qwe{
   public:
      virtual void a() {
          std::fill(data.begin(), data.end(), 1.0)};
   private:
      std::vector<double> data; };

这里有QweImpl :: a()吗?从某种意义上说,两个不同的QweImpl对象可以同时调用它们的a()函数吗?

2 个答案:

答案 0 :(得分:1)

如果类具有可以跨多个线程访问的成员,那么您将不得不使用同步机制来控制访问。

答案 1 :(得分:1)

在Windows中,您只能加载一次库。进一步尝试加载库只会增加引用计数器。因此,“为每个对象加载库”是一个非首发。

如果您的Qwe类包含数据成员或字段,我无法判断它是否存在,那么您可以使用Qwe内的关键部分(或其他一些机制)来保护对共享内存的访问。