我写了一个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
档案QRCodeGenerator
我收到错误。我知道这是删除内存线程的问题,因为我执行了同步函数Generate
并没有给出错误。
但我不知道如何删除此线程并检测Client
何时删除obj。第二件事是它无法理解为什么当线程助手不再工作时释放内存有问题。
答案 0 :(得分:2)
在销毁线程之前,您是打电话给std::thread::join()
还是detach()
?否则,std::thread
析构函数应该触发terminate()
并中止程序。
如果某些东西拥有该线程(因为&#34; 客户端尝试删除已完成线程的对象类&#34;建议),该对象可能会调用t.join()
例如,在它的析构函数中。
另请注意,您不应该销毁Fire_OnGenerate
内部的对象 - 在正在运行的线程范围内调用该对象。所以你基本上会破坏一个仍在运行的线程(它只能在Fire_OnGenerate
返回后才能完成)。