Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi getmodulefilename会阻塞什么?_Winapi_Deadlock_Getmodulefilename_Loaderlock - Fatal编程技术网

Winapi getmodulefilename会阻塞什么?

Winapi getmodulefilename会阻塞什么?,winapi,deadlock,getmodulefilename,loaderlock,Winapi,Deadlock,Getmodulefilename,Loaderlock,我们有一个多线程应用程序。其中一个工作线程调用GetModuleFilename用于日志记录,我们看到了一个死锁,工作线程在调用GetModuleFilename之前持有一个锁,该锁将永远阻塞 我们可以并且已经从这个锁中删除了GetModuleFilename调用,但是仍然对死锁是如何发生的非常感兴趣 在线阅读: GetModuleFilename似乎将获得loaderlock,这似乎是一个很好的死锁候选 但是,loaderlock中的线程通常不会执行我们自己的任何代码,除非按照上面的链接在d

我们有一个多线程应用程序。其中一个工作线程调用GetModuleFilename用于日志记录,我们看到了一个死锁,工作线程在调用GetModuleFilename之前持有一个锁,该锁将永远阻塞

我们可以并且已经从这个锁中删除了GetModuleFilename调用,但是仍然对死锁是如何发生的非常感兴趣

在线阅读:

GetModuleFilename似乎将获得loaderlock,这似乎是一个很好的死锁候选

但是,loaderlock中的线程通常不会执行我们自己的任何代码,除非按照上面的链接在dllmain中执行

在loaderlock和正在创建或销毁的另一个workerthread上可能会调用dll\u thread\u attach或detach,但我看不出有任何方法可以尝试获取我们正在使用的锁

也可能是主线程试图获取GetModuleFilename线程持有的锁,而第三个线程持有loaderlock并在主线程上执行sendmessage或类似的阻塞操作?在这里,我也没有发现任何情况下会发生这种情况

我怀疑的另一个线程是使用com对象的线程。线程在开始时调用coinitialize,因此它应该位于单线程单元中。这里有没有可能与loaderlock交互

无论如何,我们还无法确定这种死锁发生的确切方式。因此,我希望获得一些想法,或者更多关于loaderlock的信息,比如它是否被获取,以及是否有任何其他情况下代码将在loaderlock中执行,这可能会阻塞

谢谢。

只是一些随机的想法:

    >P>如果存在C++(不只是C)代码,则在系统保持加载锁时,也可以执行DLL上静态分配对象的构造函数。你不在任何地方使用你的锁在这样的对象的构造函数/析构函数中吗

  • 也许这个bug可能存在于你的锁之外,而使用锁实际上可能只是通过改变某个线程中某些操作的时间来“隐藏”一个竞争<代码>DllMain()和线程可能很棘手。看


事实证明,我所描述的问题只是我们使用的库中另一个问题的症状。该库显然在两个不同的线程中使用了一些wininet API,其中一个在dllmain中,另一个在loaderlock中。这两个线程处于死锁状态,随后锁定了名为GetModuleFileName的线程


这是我现在所知道的,但一旦我们从库的供应商那里得到更多的细节,我会更新它。

感谢这些想法,花了一些时间仔细考虑:为了使锁成为dll的一个因素,应用程序必须将特定实例传递到一个dll,这个dll应该很容易找到。我没看到这样的事。锁似乎与此有关,因为当我能够重新设置问题时,移除锁似乎会导致死锁消失。但永远也不能排除改变时间的可能性。我还编辑了问题描述以包含一个线程,该线程正在使用com对象,当我遇到此问题时,com对象似乎总是在那里。错误的链接,请使用此链接:该链接已经在问题中,显然没有帮助。但是有很多方法可以通过
DllMain()
导致死锁,我的链接也提供了一些方法。