我编写了一个 ATL DLL,但我在使用 std::thread
运行 asyn
方法时遇到了问题。我实现了异步执行操作的方法。当客户端试图删除线程已经完成的对象类时,就会出现问题。
这是我的代码:
STDMETHODIMP CQRCodeGenerator::GenerateAsync(QRCodeTypeEnum QRCodeType, QRCodeFormatEnum QRCodeFormat, LONG QRCodePx, BSTR ImageFile)
{
if (ImageFile == nullptr) ImageFile = L"";
//stack to log file
OPFHelper::add_execute_method(this, L"CQRCodeGenerator::GenerateAsync",
std::vector<std::wstring>{OPFHelper::ConvertToWSting((LONG)QRCodeType),
OPFHelper::ConvertToWSting((LONG)QRCodeFormat), OPFHelper::ConvertToWSting((LONG)QRCodePx), ImageFile});
t = std::thread(&CQRCodeGenerator::run, this, QRCodeType, QRCodeFormat, QRCodePx, ImageFile);
return S_OK;
}
void CQRCodeGenerator::run(enum QRCodeTypeEnum QRCodeType, enum QRCodeFormatEnum QRCodeFormat, LONG QRCodePx, BSTR ImageFile)
{
......
Fire_OnGenerate(this,ImageFile, _pQRCode, _pInvoiceID, _pQRCodeMD5, _pKS,nullptr);
}
std::thread
在.h
文件中声明- 当我接收事件并尝试删除 obj
QRCodeGenerator
时出现错误。
我知道这是内存线程移除的问题,因为我执行了同步函数Generate
,没有报错。
但我不知道如何删除此线程并检测 Client
何时要删除 obj。第二件事它无法理解为什么当线程助手不再工作时释放内存会出现问题。
最佳答案
在销毁线程之前调用 std::thread::join()
或 detach()
吗?否则 std::thread
析构函数应该触发 terminate()
并中止程序。
如果某物拥有该线程(正如“客户端尝试删除线程已经完成的对象类”所建议的),该对象可能会调用 t.join()
例如,在其析构函数中。
另请注意,您不应破坏 Fire_OnGenerate
内的对象 - 它是在运行线程的范围内调用的。所以你基本上会破坏一个仍在运行的线程(它只能在 Fire_OnGenerate
返回后完成)。
关于c++ - 如何安全地删除 ATL DLL 中的 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40752656/