如何声明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); };
上面的代码在我导出的“mydll.h”文件中。在一个“mydll.cpp”文件中,我定义了函数_1,并声明了另一个类似这样的类:如何声明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对象,因此程序同时崩溃 我应
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);
};