gpt4 book ai didi

multithreading - 多线程应用程序中的 DLL 和类

转载 作者:行者123 更新时间:2023-12-03 14:46:24 25 4
gpt4 key购买 nike

我的 DLL 中有一个类。并且这个DLL提供了一个“接口(interface)”来创建这个类的对象并调用它们的方法。

类代码(简化):

TLogger = class
private
//
public
function AddToLog(sBuf: PWideChar): Word;
constructor Create(Name: PWideChar);
destructor Destroy; override;
end;

constructor Create(Name: PWideChar);
begin
//
end;

destructor TLogger.Destroy;
begin
//
end;

function TLogger.AddToLog(sBuf: PWideChar): Word;
var
Temp1 : WideString;
Temp2 : AnsiString;

begin
Result := NO_ERRORS;

WaitForSingleObject( FMutex, INFINITE );

Temp1 := 'a';
Temp2 := Temp1;

//

ReleaseMutex( FMutex );
end;

DLL代码

function CreateLogger( LogFileName: PWideChar; PLogger: PCardinal): Word; stdcall;
begin
try
PLogger^ := Cardinal(TLogger.Create(LogFileName));
Result := NO_ERRORS;
except
Result := ERR_CREATE_OBJECT;
end;
end;

function DestroyLogger( PLogger: Cardinal ): Word; stdcall;
begin
try
TLogger(PLogger).Free;
Result := NO_ERRORS;
except
Result := ERR_OBJECT_NOT_FOUND;
end;
end;

function AddToLog( PLogger: Cardinal; BufStr: PWideChar ): Word; stdcall;
begin
try
Result := TLogger(PLogger).AddToLog( BufStr );
except
Result := ERR_OBJECT_NOT_FOUND;
end;
end;

当我尝试从 1 个线程使用这个库时 - 一切正常。当我创建许多使用随机周期调用函数 AddToLog 的线程(每个线程都有自己的类对象)时,问题就开始了。有时我会发现访问冲突无效的指针操作。我做了一些研究并指出,如果变量 Temp2 具有 WideString 类型,则一切正常。另一个解决方案是将互斥体移至库代码中(这只是一个“研究”代码):

function AddToLog( PLogger: Cardinal; BufStr: PWideChar ): Word; stdcall;
begin
WaitForSingleObject( TLogger(PLogger).FMutex, INFINITE );
Result := TLogger(PLogger).AddToLog( BufStr );
ReleaseMutex( TLogger(PLogger).FMutex );
end;

第二种解决方案对我来说很糟糕,因为每个对象都有自己的互斥体(想法是,如果两个对象必须使用一个文件,它们有相同的互斥体来互相等待;如果两个对象必须使用不同的文件,它们有不同的互斥锁并并行工作)。

我花了两天时间尝试解决这个问题,但我不明白出了什么问题。字符串转换怎么会导致这样的问题?

最佳答案

输入以下行:

IsMultiThread := True;

作为 DLL 项目主代码块中的第一行。这将指示内存管理器切换到线程安全模式。

这可以解释 AnsiStringWideString 之间的行为差​​异,因为 AnsiString 由 Delphi 内存管理器分配,而 WideString 分配在 COM 堆上。当 IsMultiThreadFalse 时,Delphi 内存管理器不是线程安全的,但 COM 堆始终是线程安全的。

关于multithreading - 多线程应用程序中的 DLL 和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17950545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com