从dll导入的类的线程安全性
thread safety of a class imported from dll
我有一个导出接口的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中使用临界区(或其他机制)来保护对共享内存的访问。
如果类的成员可以跨多个线程访问,那么您将不得不使用同步机制来控制访问。
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- std::lock_guard 似乎提供了线程安全性,尽管作用域块
- C++中向量和列表的非写入成员函数的线程安全性
- 线程安全性和静态变量/成员功能
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 提高 ASIO stream_descriptor和事件 FD 线程安全性
- OpenMP中树结构的线程安全性
- 静态变量初始化的线程安全性
- 从另一个(非 qt)线程调用 QObject 方法的线程安全性?
- C 共享_ptr如何确保线程安全性
- 编写std::vector与普通数组的线程安全性
- C++标准库容器相对于所包含对象的线程安全性
- 读取和写入操作的线程安全性C++
- Qt库-静态成员函数的线程安全性
- QObject可重入性和线程安全性
- std::map中的线程安全性
- boost::asio io_service 和 std::containers 的线程安全性
- C++11 std:原子<T>复制构造函数的线程安全性
- Clang 线程安全性分析和线程角色