我有一个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内部的关键部分(或某些其他机制)来保护对共享内存的访问。

关于c++ - 从dll导入的类的线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7336488/

10-10 11:01