C++ 从dll导入的类的线程安全性
我有一个输出接口的dllC++ 从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
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实例,那么它不是线程安全的。您需要一个关键部分来确保写入数据是安全的。