如何声明由多个线程调用的C ++ DLL的内部类,而无需导出该类

时间:2018-10-15 14:51:10

标签: c++ multithreading

我正在制作一个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以避免线程冲突?

1 个答案:

答案 0 :(得分:2)

选项:

  1. 创建class_2 thread_local的实例。每个线程一个。如果您的class_1在不同的线程中访问class_2实例,这可能会令人惊讶。

  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中被调用,因此这是安全的。