我正在制作一个c ++ dll,我从中导出了一个简单的类。在目标程序中,我在多个线程中创建了该类的多个对象。我在dll中有另一个类,该类既不导出也不在导出的类中声明。我在cpp文件中声明了隐藏的类(其中包含函数),并在主类的构造函数中对其进行了初始化。下面的代码演示了我的解释:
#define DllExport __declspec( dllexport )
class class_1
{
public:
DllExport class_1();
DllExport ~class_1();
DllExport int function_1(unsigned char* input);
};
上面的代码在我导出的“ mydll.h”文件中。在“ mydll.cpp”文件中,我定义了function_1,并且还声明了另一个这样的类:
class class_2
{
public:
class_2();
~class_2();
int function_2(int a);
};
class_2将在class_1的构造函数中初始化。在目标项目中,我制作了class_1的多个对象并在不同的线程中使用它们时,class_2对象是“ common”,而当2个线程在使用class_1的对象时,它们只能访问一个class_2对象,因此程序崩溃。 >
在dll中应在哪里以及如何声明和初始化class_2以避免线程冲突?
答案 0 :(得分:2)
选项:
创建class_2
thread_local
的实例。每个线程一个。如果您的class_1
在不同的线程中访问class_2
实例,这可能会令人惊讶。
在pImpl
上添加一个class_1
,它指向不透明的class_2
。
所以:
class class_2;
class class_1 {
std::unique_ptr<class_2> pImpl;
public:
DllExport class_1();
DllExport ~class_1();
DllExport int function_1(unsigned char* input);
};
由于~unique_ptr<class_2>
仅在~class1
中被调用,因此这是安全的。