如何安全地删除ATL DLL

时间:2016-11-22 22:18:03

标签: c++ multithreading atl stdthread

我写了一个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);
}   
  1. std::thread.h档案
  2. 中声明
  3. 当我接收活动时,我尝试删除obj QRCodeGenerator我收到错误。
  4. 我知道这是删除内存线程的问题,因为我执行了同步函数Generate并没有给出错误。

    但我不知道如何删除此线程并检测Client何时删除obj。第二件事是它无法理解为什么当线程助手不再工作时释放内存有问题。

1 个答案:

答案 0 :(得分:2)

在销毁线程之前,您是打电话给std::thread::join()还是detach()?否则,std::thread析构函数应该触发terminate()并中止程序。

如果某些东西拥有该线程(因为&#34; 客户端尝试删除已完成线程的对象类&#34;建议),该对象可能会调用t.join()例如,在它的析构函数中。

另请注意,您不应该销毁Fire_OnGenerate内部的对象 - 在正在运行的线程范围内调用该对象。所以你基本上会破坏一个仍在运行的线程(它只能在Fire_OnGenerate返回后才能完成)。