我有一个导出接口的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()函数吗?
答案 0 :(得分:1)
如果类具有可以跨多个线程访问的成员,那么您将不得不使用同步机制来控制访问。
答案 1 :(得分:1)
在Windows中,您只能加载一次库。进一步尝试加载库只会增加引用计数器。因此,“为每个对象加载库”是一个非首发。
如果您的Qwe类包含数据成员或字段,我无法判断它是否存在,那么您可以使用Qwe内的关键部分(或其他一些机制)来保护对共享内存的访问。