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

thread safety of a class imported from dll

本文关键字:线程 安全性 导入 dll      更新时间:2023-10-16

我有一个导出接口的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()函数?

在windows中,您只能加载一次库。进一步加载库的尝试只会增加引用计数器。因此,"为每个对象加载一个库"是行不通的。

如果你的Qwe类包含数据成员或字段,我不知道它是否包含,那么你可以在Qwe中使用临界区(或其他机制)来保护对共享内存的访问。

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