小编Hug*_*ooo的帖子

调用FreeLibrary可能存在死锁

我必须在Delphi XE7中编写一个DLL.我想在DLL中使用TParallel.For.DLL被加载到C++应用程序中,一切正常.但是,当应用程序终止或调用FreeLibrary时,应用程序将挂起.如果我删除所有TParallel.For循环并用标准循环替换它们,应用程序将正常退出.

TParallel.For循环非常简单:

TParallel.For(0, inImage.Height -1, 
  Procedure(ty : integer)
  begin
    SomeProcedure(ty);
  end);
Run Code Online (Sandbox Code Playgroud)

如果我用完全相同的代码创建一个Delphi应用程序,一切都很完美.

在做了大量的研究和调试之后,看起来有一个死锁阻止了C++应用程序在调用FreeLibrary时退出,但是我找不到TParallel中的问题所在.

只是总结一下情况:

  • TParallel.For循环全部完成并产生正确的结果.
  • 完全相同的TParallel.For Delphi .exe中的代码正常工作.
  • 加载DLL并调用函数并从C++应用程序中正确执行.
  • 如果没有TParallel.For循环,C++应用程序将正确退出.
  • 如果有TParallel.For循环,C++应用程序将挂起.
  • 我猜测在调用FreeLibrary时会发生死锁.
  • 如果我使用OTL线程库,一切都可以正常工作.

我的问题是:

有没有其他人经历过这种行为?

在这种情况下找到死锁的好调试策略是什么?

任何意见是极大的赞赏.

UPDATE

好的,所以如果你想要最小,完整和可验证的例子,那么你去(谢谢Stephen Ball):

library ADelphiDLL;

uses
  System.SysUtils, System.Classes, Threading, SyncObjs;

function IsPrime (N: Integer): Boolean;
var
 Test: Integer;
begin
 IsPrime := True;
 for Test := 2 to N - 1 do
   if (N mod Test) = 0 then
   begin
     IsPrime := False;
     break; {jump out of the for loop}
   end;
end;

function …
Run Code Online (Sandbox Code Playgroud)

c++ delphi dll

10
推荐指数
1
解决办法
440
查看次数

标签 统计

c++ ×1

delphi ×1

dll ×1