gpt4 book ai didi

multithreading - 在这种情况下,我是否需要一个线程安全的字符串列表来防止死锁?

转载 作者:行者123 更新时间:2023-12-03 18:28:15 25 4
gpt4 key购买 nike

我正在使用一个简单的静态线程池,其中有 4 个线程,每个线程都有一个队列,用于处理字符串列表中的各个行。在每个线程完成其队列中的一个请求后,它会同步一个事件,该事件在父线程中处理。这是通过调用 DoComplete() 来完成的。完成后,像这样:

procedure TDecoderThread.DoComplete(const Line: Integer; const Text: String);
begin
FLine:= Line;
FText:= Text;
Synchronize(SYNC_OnComplete);
end;

procedure TDecoderThread.SYNC_OnComplete;
begin
if assigned(FOnComplete) then
FOnComplete(Self, FText, FLine); //Triggers event which is handled in parent thread
end;

另一方面,在它们的父线程中,这些事件通过以下过程处理:
procedure TDecoder.ThreadComplete(Sender: TDecoderThread; const Text: String;
const Line: Integer);
begin
FStrings[Line]:= Text; //Updates the original line in the list with the new text
end;

因为我有 4 个不同的线程,每个线程都可以调用 OnComplete()事件同时发生,难道我还要担心线程保护这个 FStrings: TStrings ?两个线程可以触发它们的 OnComplete()吗?写入此字符串列表时,事件同时导致其父线程中的死锁?或者主线程是否足够聪明,可以等到其中一个完成后再处理另一个?

PS - 是的,这个小项目试图回答 another previous question从这里的其他人那里得到的答案大不相同,但为了让自己更熟悉多线程,我还是继续这个示例项目。

最佳答案

由于OnComplete事件由 Synchronize() 触发,您不需要在 FStrings 周围使用线程安全锁。列表,因为对列表的所有访问都是通过主线程委托(delegate)的,所以只有一个 OnComplete事件处理程序实际上可以一次运行。如果您没有使用 Synchronize() ,您将需要这样的锁定 FStrings如果正在添加/删除项目并因此重新分配列表内存,或者如果其他线程正在从 FStrings 读取值,而线程仍在运行。如果处理线程是唯一访问 FStrings 的线程,单个项目的并发访问没有风险,因此不需要锁定。

关于multithreading - 在这种情况下,我是否需要一个线程安全的字符串列表来防止死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354497/

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