一个线程调用dll的这个接口之后,这个接口还没有返回,另一个个线程又调用了这个接口,那么dll中,是处理怎么第二个调用的?是让第二个调用等待,还是和第一个接口并行调用?
8 个解决方案
#1
不一定什么样。跟接口的实现有关系。可以把动态库的接口看成普通函数。如果接口允许多个线程并行用,就是“和第一个接口并行调用”。如果不允许(加锁了)就是“让第二个调用等待”,即便加锁,等待也是在接口内部等待(进入锁之前的等)
#2
如果在DLL的接口中没有数据冲突(如对同一内存的使用和销毁),各个线程同时使用没有问题,如果有冲突(如资源对象,像串口SOCKET等),就需要加锁,同一时间只能有一个线程在使用接口逻辑。
#3
Dll多线程调用,Windows会有同步处理,所以要防止造成死锁
#4
没听说过:多个线程调用一个dll的同一个接口时,Windows会有同步处理。
多个线程可以任意调用一段代码(自己程序的代码也好,DLL的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。
多个线程可以任意调用一段代码(自己程序的代码也好,DLL的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。
#5
异步调用如果涉及全局资源则需要加锁,如果是形如
这种就不需要,若这dll非你所开发,那该咨询相应开发人员。
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的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。
多个线程可以任意调用一段代码(自己程序的代码也好,DLL的接口方法也好)。
如果任意调用会导致逻辑错误(比如一个线程调用未返回,另一个线程又去调用),就必须给方法加上同步保护。
#5
异步调用如果涉及全局资源则需要加锁,如果是形如
这种就不需要,若这dll非你所开发,那该咨询相应开发人员。
int add(int a,int b)
{return a+b;}
这种就不需要,若这dll非你所开发,那该咨询相应开发人员。
#6
全部都是局部变量可以并行,但是如果有全局变量就需要加锁
#7
跟你的普通代码一样的调用机制,没有任务特殊之处,DLL加载到你的进程空间了,你多线程执行DLL的代码,和你多线程执行自己写的代码一样,没什么特别的,多线程调用该注意的地方也都一样。
#8
如果DLL或者线程中没有同步机制的话,当然会并行执行