多个线程调用一个dll的同一个接口

时间:2022-09-28 11:18:49
程序加载了一个dll,之后该程序的多个线程调用一个dll的同一个接口。
一个线程调用dll的这个接口之后,这个接口还没有返回,另一个个线程又调用了这个接口,那么dll中,是处理怎么第二个调用的?是让第二个调用等待,还是和第一个接口并行调用?

8 个解决方案

#1


不一定什么样。跟接口的实现有关系。可以把动态库的接口看成普通函数。如果接口允许多个线程并行用,就是“和第一个接口并行调用”。如果不允许(加锁了)就是“让第二个调用等待”,即便加锁,等待也是在接口内部等待(进入锁之前的等)

#2


如果在DLL的接口中没有数据冲突(如对同一内存的使用和销毁),各个线程同时使用没有问题,如果有冲突(如资源对象,像串口SOCKET等),就需要加锁,同一时间只能有一个线程在使用接口逻辑。

#3


Dll多线程调用,Windows会有同步处理,所以要防止造成死锁

#4


没听说过:多个线程调用一个dll的同一个接口时,Windows会有同步处理。

多个线程可以任意调用一段代码(自己程序的代码也好,DLL的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。

#5


异步调用如果涉及全局资源则需要加锁,如果是形如

 int add(int a,int b)
 {return a+b;}

这种就不需要,若这dll非你所开发,那该咨询相应开发人员。

#6


全部都是局部变量可以并行,但是如果有全局变量就需要加锁

#7


跟你的普通代码一样的调用机制,没有任务特殊之处,DLL加载到你的进程空间了,你多线程执行DLL的代码,和你多线程执行自己写的代码一样,没什么特别的,多线程调用该注意的地方也都一样。

#8


如果DLL或者线程中没有同步机制的话,当然会并行执行

#1


不一定什么样。跟接口的实现有关系。可以把动态库的接口看成普通函数。如果接口允许多个线程并行用,就是“和第一个接口并行调用”。如果不允许(加锁了)就是“让第二个调用等待”,即便加锁,等待也是在接口内部等待(进入锁之前的等)

#2


如果在DLL的接口中没有数据冲突(如对同一内存的使用和销毁),各个线程同时使用没有问题,如果有冲突(如资源对象,像串口SOCKET等),就需要加锁,同一时间只能有一个线程在使用接口逻辑。

#3


Dll多线程调用,Windows会有同步处理,所以要防止造成死锁

#4


没听说过:多个线程调用一个dll的同一个接口时,Windows会有同步处理。

多个线程可以任意调用一段代码(自己程序的代码也好,DLL的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。

#5


异步调用如果涉及全局资源则需要加锁,如果是形如

 int add(int a,int b)
 {return a+b;}

这种就不需要,若这dll非你所开发,那该咨询相应开发人员。

#6


全部都是局部变量可以并行,但是如果有全局变量就需要加锁

#7


跟你的普通代码一样的调用机制,没有任务特殊之处,DLL加载到你的进程空间了,你多线程执行DLL的代码,和你多线程执行自己写的代码一样,没什么特别的,多线程调用该注意的地方也都一样。

#8


如果DLL或者线程中没有同步机制的话,当然会并行执行