多线程 dll 和 lock whan 从第二个线程调用函数

Posted

技术标签:

【中文标题】多线程 dll 和 lock whan 从第二个线程调用函数【英文标题】:Multithreaded dll and lock whan calling function from second thread 【发布时间】:2012-03-05 19:08:21 【问题描述】:

我有可以使用 dll 插件的程序。如果程序想请求插件做出决定,它会向 dll 发送消息并等待结果。

程序还给出了 dll,指向 GetSymbol 函数的指针。使用这个函数,dll可以向程序请求一些符号。

我创建了某种 dll 代理。如果程序向 dll 发送消息,则 dll 向客户端发送 xmlrpc 调用并返回结果。 Dll 还有第二个线程作为 xmlrpc 服务器。所以客户端可以发送 xmlrpc 调用来请求符号。

我发现了一些有趣的问题。而且我不知道出了什么问题。当我使用线程 1 中的 GetSymbol 函数时,一切正常。但是当我试图从线程 2 程序锁中使用它时......有可能吗? Program如何知道哪个DLL线程调用了GetSymbol函数?

【问题讨论】:

所以你的程序实际上得到了符号,但是当GetSymbols方法被调用时,你的程序没有返回?您是否在GetSymbols 中使用了任何类型的线程同步机制(即锁定、监控、重置事件等)? “程序”不是我的程序,我只是在写“程序”使用的 dll。看起来我可以在 dll 中调用 GetSymbol,但只能在线程 1 中调用,当我从线程 2 调用它时,“程序”永远不会返回。在调试器中,我可以看到它在等待某个锁。 在我看来,这不是你的问题……写程序的人应该确保回调方法正常工作。 谢谢,但是“程序”怎么可能发现哪个线程调用了 GetSymbol?也许我可以为此做一些解决方法? 我怀疑“程序”使用互斥锁来保护对其内部位的调用。此锁可能由最初调用process_message 的应用程序线程拥有/获取,但是当您在另一个线程上调用GetSymbol 时,新线程会尝试获取互斥锁并阻塞。我想你需要在调用 process_message 的线程和你的 xmlrpc 线程之间实现某种消息传递,以便让 process_message 线程调用 GetSymbol 【参考方案1】:

可能是互斥体。

程序在运行到 dll 时可能持有互斥锁。并且 GetSymbol 尝试在内部锁定相同的互斥体以保护某些结构。

如果同一个线程再次尝试锁定互斥体,它将通过并增加互斥体上的锁定计数。 (可重入互斥体)。

如果 thread2 调用 GetSymbol,它实际上会等待互斥体。并且“程序”也会保留它,因为它首先等待 process_message 完成。

【讨论】:

以上是关于多线程 dll 和 lock whan 从第二个线程调用函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt:没有从第二个线程调用插槽

BAT美团滴滴java面试大纲(带答案版)之四:多线程Lock

C++11多线程 unique_lock详解

“全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

Python多线程和多进程爬虫

JMeter - 将值从第一个 JDBC 请求传递到第二个 JDBC 请求