3

我有一个 COM/ATL dll,它在DllGetClassObject入口点初始化我的自定义记录器,并在重写的ExitInstance函数中取消初始化这个记录器。Logger 被实现为单独的线程,它定期检查其缓冲区并快速记录所有记录。

现在,问题。如您所知,Windows 会定期检查未使用的 COM dll 并卸载它们。我想在 dll 卸载过程中等待记录器线程完成,但我想不出正确的方法。我尝试了几种解决方案:

  1. 使用WaitForSingleObject等待记录器线程完成。这不起作用,因为主线程在DllMain函数中。

  2. 创建自定义事件并在记录器线程退出之前触发它:

    SetEvent(_loggerExitEvent);
    // can be blocked here!
    return 0;
    

    这也不起作用,因为这个代码块不是原子的。记录器线程可以触发事件并被阻止,直到 dll 从内存中卸载,然后再次唤醒,只会产生讨厌的访问冲突错误。

  3. 如果我 100% 确定记录器线程将返回,则在接收到上述事件后使用TeminateThread 。这很不靠谱。

  4. 循环我的主线程以定期检查记录器线程状态:

    while(TRUE == ::GetExitCodeThread(_loggerThread, &loggerThreadExitCode) && loggerThreadExitCode== STILL_ACTIVE)
    {
        Sleep(100);
    }
    

    很脏也很不稳定。如果GetExitCodeThread返回 FALSE 怎么办?

所以,问题是,在 dll 卸载过程中等待另一个线程完成是否有正确的方法?还是我做错了什么?

4

0 回答 0