我正在查看一个挂在Server 2016上但在Server 2008 R2上运行find的应用程序。我已将其追溯到由特定DLL加载时死锁引起的挂起。分析DLL(我没有源代码),可以看到它违反了准则here
特别是它从DllMain调用GetStringTypeW。
我试图了解此功能如何导致DllMain中的死锁。
您的DllMain函数在加载程序锁中运行,这是少数几个操作系统允许您运行代码而其内部锁定之一是保持。这意味着您必须格外小心,不要违反锁DllMain中的层次结构;否则,您将陷入僵局。 (请参阅“ Another reason not to do anything scary in your DllMain: Inadvertent deadlock”)
在保持加载程序锁定的同时调用[DllMain
,因此,如果GetStringType
获得了加载程序锁定,则会出现死锁。
对可以在DllMain中调用。因此,DllMain设计为执行最小初始化任务,通过使用一小部分Microsoft®Windows®API。 您不能直接在DllMain中调用任何函数或间接尝试获取加载程序锁。否则,您将引入您的应用程序死锁或崩溃的可能性。
我们看不到GetStringType
函数的源代码。建议遵循GetStringType
。