首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DLL和WideString时的竞态条件

使用DLL和WideString时的竞态条件
EN

Stack Overflow用户
提问于 2018-01-09 20:22:15
回答 1查看 222关注 0票数 2

我遇到了以下问题:当从多个线程并行调用DLL函数时,我得到"EAggregateException:出现一个或多个错误“。

最小的DLL示例如下:

代码语言:javascript
复制
library MyDLL;

uses
  System.SysUtils;

procedure MyUpper(const ASource: WideString; out AResult: WideString); stdcall;
begin
  AResult := String(ASource).ToUpper;
end;

exports
  MyUpper;

end.

使用它的应用程序:

代码语言:javascript
复制
program MyEXE;

uses
  System.SysUtils,
  System.Threading;

procedure MyUpper(const AText: WideString; out AResult: WideString); stdcall; external 'MyDLL.dll';

procedure Test;
var
  LLoop: TParallel.TLoopResult;
  LSync: IReadWriteSync;
begin
  LSync := TSimpleRWSync.Create;
  LLoop := TParallel.&For(1, 100000,
    procedure (AIndex: Integer)
    var
      LResult: WideString;
    begin
      MyUpper(AIndex.ToString, LResult);
    end);

  Writeln('Completed: ', LLoop.Completed);
end;

begin
  try
    Test;
  except
    on E: Exception do
      Writeln(E.ClassName + ': ' + E.Message);
  end;
  Readln;
end.

如果在EXE中,我编写了以下代码:

代码语言:javascript
复制
AResult := ASource;

则执行成功。但是一旦我使用了任何隐式/显式字符串转换,它就会失败。这怎么可能呢?每个线程将此方法作为常规方法与其本地堆栈一起调用,并且没有共享变量(至少是可见的)。

我不使用任何共享内存管理器,因为我将使用来自不同编程语言的DLL。

我做错了什么?

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2018-01-09 20:46:57

如果假设在多线程环境中使用DLL,则在库的初始化部分中放入以下代码行:

代码语言:javascript
复制
IsMultiThread := True;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48168154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档