2

我试图更详细地了解操作系统加载程序锁是如何与 Windows 中 DLL 的加载和卸载相关的。

我知道当创建/销毁新线程和/或加载/卸载新 DLL 时,每个加载的 DLL 都会收到通知。

那么这是否意味着 DllMain 函数在锁内运行,并且在它运行时没有其他线程可以访问它,如果您要在该函数中创建另一个线程,您可以挂起进程甚至操作系统?

我的理解正确吗?

有什么文章可以解释这一点吗?

4

3 回答 3

1

当两个线程尝试以不同的顺序获取两个锁时,可能会发生死锁。

  • 线程 A 获取锁 A,然后尝试获取锁 B
  • 同时线程 B 获得锁 B 然后尝试获得锁 A

运行 DllMain 的线程已经获得了一个隐式的 O/S 锁:因此他们(微软)认为该线程尝试获得任何其他第二个锁可能是不安全的(例如,因为不同的线程可能已经拥有该锁并且当前被隐式 O/S 锁阻塞)。

于 2010-06-20T12:26:19.157 回答
0

那是对的。

任何此类执行都是非法的,因为它可能导致死锁和在操作系统加载程序初始化 DLL 之前使用它们。

更多信息可以在这里找到:LoaderLock MDA(MSDN 网站)

于 2010-06-20T12:23:48.227 回答
0

Raymond Chen 解释了这一点

于 2010-06-22T09:38:08.817 回答