只要不是永远,在DllMain (PROCESS_DETATCH)中等待是可以的吗?
Is it ok to wait in DllMain (PROCESS_DETATCH) as long as its not forever?
我正在编写一个通过USB与硬件通信的接口Dll。为了完全满足硬件的定时要求(防止它在没有操作消息等的情况下超时),我在调用"Open()"方法时立即为每个惰性初始化创建一个工作线程。当我的"close()"方法被调用时,我设置了一个名为"terminate"的事件,该事件由工作线程监控,并等待工作线程终止。终止需要几百毫秒,因为需要与硬件交换一些消息。
到目前为止一切都很好,唯一的问题是当一个程序卸载Dll没有调用我的"Close()"方法…我通过在DllMain (PROCESS_DETATCH)中设置"终止"事件来解决这个问题,我很确定我可以这样做,并且仍然完全填补最佳实践。唯一的问题是,如果Dll在没有调用close的情况下卸载,但在旧的工作线程终止之前再次重新加载,我会在加载我的Dll的过程中导致超时,因为我正在等待旧的工作线程完成。
所以这里是我的问题:将等待工作线程终止在DllMain (PROCESS_DETATCH)超时说500毫秒导致任何问题,如果我只做它时,一个工作线程存在,只有当我被卸载(通过freeLibrary),而不是当我的整个进程被终止,我通过查看lpvReserved参数测试?
还有:有没有更好的方法来解决我的问题?
唯一会发生的事情是使调用FreeLibrary
的线程(FreeLibrary不是异步的,它等待返回值)等待只要你的模块正在卸载。
我做了一些DLL,有时甚至像DLLMain中的while(!IsDebuggerAttached()){}
这样的循环附加/分离,我测试的程序的行为就像他们需要的一样。
至于其他问题的解决方案:除了DLLMain附加/分离之外,为什么还需要其他具有相同功能的东西?
我在我的PROCESS_DETACH中实现了等待,它起初工作,但在一个角落的情况下,它最终导致了问题。问题是我们的调试输出设置加载了一个专有的DLL,以便在调试输出中包含版本信息。如果我们的DLL快速加载和卸载,并且在后台有足够的时间来读取这个版本信息,那么它可能会在进程等待PROCESS_DETACH时发生,从而导致死锁。
对于未来,我已经决定不再等待dlmin中的任何东西,因为我等待的任何东西都可能在某些角落的情况下或在其他人向某些类添加功能后被触摸,导致加载器锁上死锁。
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 如何处理 RAII 中的资源等待