c++ - 如何安全地删除 ATL DLL 中的 std::thread

标签 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. 当我接收事件并尝试删除 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/

相关文章:

c++ - 从 ListView 控件中删除项目

c++ - 为 map 赋值的最有效方式

visual-c++ - 最新的 ATL 版本

c++ - 如何根据数组参数项类型重载 IDL 中的函数?

c++ - 生成导出包含 ATL::CString 成员的类的 DLL 时出现警告 C4251

c++ - 如何将数字向上舍入到下一个整数

c++ - Qt线程同步

java - 使用 ExecutorService 重复并行执行多个相似的任务

java - 带有新线程的新 JFrame

c++ - 通过 typedef template<typename T, T> 强制模板实例化 - 为什么它有效?