如何声明C++;被多个线程调用而不导出类的DLL 我正在制作一个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); };

如何声明C++;被多个线程调用而不导出类的DLL 我正在制作一个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); };,c++,multithreading,C++,Multithreading,上面的代码在我导出的“mydll.h”文件中。在一个“mydll.cpp”文件中,我定义了函数_1,并声明了另一个类似这样的类: class class_2 { public: class_2(); ~class_2(); int function_2(int a); }; 类_2将在类_1的构造函数中初始化。在目标项目中,我创建多个类_1对象并在不同线程中使用它们时,类_2对象是“公共”的,当两个线程使用类_1对象时,它们只访问一个类_2对象,因此程序同时崩溃 我应

上面的代码在我导出的“mydll.h”文件中。在一个“mydll.cpp”文件中,我定义了函数_1,并声明了另一个类似这样的类:

class class_2
{
public:
    class_2(); 
    ~class_2();
    int function_2(int a);
};
类_2将在类_1的构造函数中初始化。在目标项目中,我创建多个类_1对象并在不同线程中使用它们时,类_2对象是“公共”的,当两个线程使用类_1对象时,它们只访问一个类_2对象,因此程序同时崩溃

我应该在哪里以及如何在dll中声明和初始化类_2以避免线程冲突

选项:

  • class_2
    的实例设置为本地
    线程
    。每个线程将存在一个。如果您的
    class_1
    在不同的线程中访问
    class_2
    实例,这可能会令人惊讶

  • 将指向不透明的
    class_2
    pImpl
    添加到
    class_1

  • 因此:

    class_2;
    第1类{
    std::唯一的ptr pImpl;
    公众:
    DllExport类_1();
    DllExport~class_1();
    DllExport int函数_1(无符号字符*输入);
    };
    
    由于只在
    ~class1
    中调用
    ~unique\u ptr
    ,因此这是安全的。

    选项:

  • class_2
    的实例设置为本地
    线程
    。每个线程将存在一个。如果您的
    class_1
    在不同的线程中访问
    class_2
    实例,这可能会令人惊讶

  • 将指向不透明的
    class_2
    pImpl
    添加到
    class_1

  • 因此:

    class_2;
    第1类{
    std::唯一的ptr pImpl;
    公众:
    DllExport类_1();
    DllExport~class_1();
    DllExport int函数_1(无符号字符*输入);
    };
    

    由于
    ~unique\u ptr
    仅在
    ~class1
    中调用,因此这是安全的。

    谢谢您的帮助。现在我很困惑如何将参数传递给类2(pimpl类)的构造函数?我使用make_unique,但它给出了错误。我写了这样的东西:class_1::class_1(const wchar_t*m_文件):pImpl(std::make_unique(m_文件))@我试着问另一个问题;注释不允许上下文解决这样的错误谢谢您的帮助。现在我很困惑如何将参数传递给类2(pimpl类)的构造函数?我使用make_unique,但它给出了错误。我写了这样的东西:class_1::class_1(const wchar_t*m_文件):pImpl(std::make_unique(m_文件))@我试着问另一个问题;注释不允许上下文解决这样的错误
    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);
    };