为了账号安全,请及时绑定邮箱和手机立即绑定

可以在多线程 DLL 的接口函数中创建线程吗?

可以在多线程 DLL 的接口函数中创建线程吗?

守候你守候我 2019-02-20 19:15:38
我把自己写的一些函数做成了支持多线程的DLL。现在有一个需求:调用 DLL 的 A 函数时,需要在 A 中创建一个工作者线程。线程创建函数 thread_create(thread_t *th,void *(*start)(void*),void *arg) 调用_beginthreadex 创建线程。不知能否这样做???现在的情况是,当其他应用程序调用这个 DLL时,就说:无法解析的外部符号 _thread_create,该符号在函数 A 中被引用(IDE:VS2005)谢谢,忘了说了,我的是 C 的程序,发到C#这儿了,不好意思。我没有在 DLLMain 中创建线程,而是其他导出函数。在帮我分析下?呵呵A 函数的实现没有写到C文件中。thread_create 是DLL 的内部函数,不是导出函数,不需要导出吧。
查看完整描述

4 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

共享一份DLL
-------------
原因涉及DLL加载和运行机制,主要有两点:
1)DLL动态链接库无法独立运行,必须由一个应用程序进程加载到进程空间后才能使用。加载DLL的进程称为宿主进程。被加载的DLL属于宿主进程,不属于宿主进程内某个线程。
2)宿主进程可以重复调用,甚至重复加载DLL。第1次调用DLL或第1次加载DLL时,宿主进程将DLL引入进程空间。一旦宿主进程成功加载DLL,随后的重复调用或重复加载只会增加“引用计数”,而不会加载多份DLL,所以进程中只有一份DLL。

查看完整回答
反对 回复 2019-03-26
?
慕容森

TA贡献1853条经验 获得超18个赞

C#本身就能支持线程,为什么还要多此一举的去调用DLL创建线程了.
印象中微软说过不要再DllMain中创建线程,否则会死的很惨.可以查阅MSDN.
不过导出函数中应该是可以创建线程的...应该是你的代码写滴不对,不过没必要舍近求远吧

查看完整回答
反对 回复 2019-03-26
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

应该是你的A函数的实现写在头文件里了。A里面调用了thread_create,但是thread_create的实现没有从dll里export出来,所以就出这个错。
解决办法:把A函数的实现写到C文件里,头文件里只包含一个声明就够了。 记得导出A函数。。。

thread_create不需要导出。一个原则:只要你的客户端(就是调用DLL的程序)代码能看见thread_create,肯定就会有问题。你只要把A函数放到dll代码的C文件里,头文件里只留个声明,这样客户端就看不到thread_create,也就不会出现刚才那个错误。

查看完整回答
反对 回复 2019-03-26
  • 4 回答
  • 0 关注
  • 1729 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信