C# 多线程调用C++Dll中同一函数出现问题!!!

时间:2021-11-19 10:42:12
winform开发时需要调用c++编写的视频解码动态库,需要在C#中建立多个线程调用DLL中同一函数,但是不知道为什么程序就死了,调试找不到错误。(动态库没有问题,因为在C++中调用DLL都没有问题)

16 个解决方案

#1


该回复于2011-10-28 08:32:51被版主删除

#2


很简单,你的非托管dll中的引出函数不是线程安全的,比如这个函数可能在内部用了一个全局变量,如果多线程调用这个函数,则会导致全局变量的值非法而导致崩溃,c++写的程序很脆弱,稍微不对就会崩溃,

#3


你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,

#4


引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


说的有道理!

不过,建议先不用多线程,测试这个dll,能否正常在C#中使用。。。

#5


单线程,可以播放,但是多线程就有问题,请大家帮忙下

#6


引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


锁了,但是还是有问题,求原因啊

#7


你得跟踪下。

#8


你得跟踪下。

#9


引用 6 楼 a6210575 的回复:
引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


锁了,但是还是有问题,求原因啊


怎么跟踪,能具体点嘛,很急啊

#10


引用 8 楼 uncle_bacon 的回复:
你得跟踪下。


怎么跟踪啊,能具体点嘛,很急啊

#11


引用 8 楼 uncle_bacon 的回复:
你得跟踪下。


怎么跟踪啊,能具体点嘛,很急啊

#12


你是怎么锁的?因为函数时全局的,lock的对象应该是一个static对象,

#13


你也可以用c++写个测试程序,在c++下用多线程访问这个dll,看是否有问题,

#14


LS解释得很清楚了
C++的那个函数执行时,出现了竞态条件问题

#15


顶顶帖子

#16


调用C++的DLL,单线程可以,而多线程又不行,简单就是Lock 一个静态变量,然后调用DLL。这样不行的话就是DLL不支持多线程调用了

#1


该回复于2011-10-28 08:32:51被版主删除

#2


很简单,你的非托管dll中的引出函数不是线程安全的,比如这个函数可能在内部用了一个全局变量,如果多线程调用这个函数,则会导致全局变量的值非法而导致崩溃,c++写的程序很脆弱,稍微不对就会崩溃,

#3


你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,

#4


引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


说的有道理!

不过,建议先不用多线程,测试这个dll,能否正常在C#中使用。。。

#5


单线程,可以播放,但是多线程就有问题,请大家帮忙下

#6


引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


锁了,但是还是有问题,求原因啊

#7


你得跟踪下。

#8


你得跟踪下。

#9


引用 6 楼 a6210575 的回复:
引用 3 楼 stonespace 的回复:
你可以在互斥访问这个dll的函数,在调用这dll函数时,先lock一下,保证不会有多个线程同时调用一个函数,


锁了,但是还是有问题,求原因啊


怎么跟踪,能具体点嘛,很急啊

#10


引用 8 楼 uncle_bacon 的回复:
你得跟踪下。


怎么跟踪啊,能具体点嘛,很急啊

#11


引用 8 楼 uncle_bacon 的回复:
你得跟踪下。


怎么跟踪啊,能具体点嘛,很急啊

#12


你是怎么锁的?因为函数时全局的,lock的对象应该是一个static对象,

#13


你也可以用c++写个测试程序,在c++下用多线程访问这个dll,看是否有问题,

#14


LS解释得很清楚了
C++的那个函数执行时,出现了竞态条件问题

#15


顶顶帖子

#16


调用C++的DLL,单线程可以,而多线程又不行,简单就是Lock 一个静态变量,然后调用DLL。这样不行的话就是DLL不支持多线程调用了