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

C++ 从dll导入的类的线程安全性,c++,dll,thread-safety,shared-libraries,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

我有一个输出接口的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:公共Qwe{ 公众: 虚空a(){ std::fill(data.begin(),data.end(),1.0)}; 私人: std::矢量数据;};
QweImpl::a()在这里安全吗?从某种意义上说,两个不同的QweImpl对象可以同时调用它们的a()函数?

如果类具有可跨多个线程访问的成员,则必须使用同步机制来控制访问

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


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

Qwe没有任何数据,它的实现肯定有。准确地说,导出的类QweImpl:publicqwe{public:virtualvoid a(){std::fill(data.begin(),data.end(),1.0);};private:std::vector data;};在()函数中需要注意线程本身的安全性?很抱歉,我没有在注释中输入代码,这里有可能吗?如果您希望多个线程访问一个特定的QweImple实例,那么它不是线程安全的。您需要一个关键部分来确保写入数据是安全的。