gpt4 book ai didi

multithreading - 从多个线程访问公共(public)变量/对象是否会在 Delphi 中产生异常?

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

如果多个线程正在执行类过程 TDjelatBL.Test ,是否会因为访问变量iPublic而出现异常? ?

我的问题的重点是,如果同时从两个或多个线程访问相同的变量/对象/常量会引发异常。我假设变量/对象变化的性质不会像改变数组大小那样改变内存分配。

我发现的最接近的问题(与这个问题相比)是 Is a Delphi global procedure threadsafeAre Delphi simple types thread safe?但从未提及引发异常。

unit MTTest;

interface

uses
System.SysUtils, System.Classes;

type

TDjelatBL = class
public
class procedure Test;
end;

var
iPublic: Integer;
StringList: TStringList;

implementation

class procedure TDjelatBL.Test;
var
i: Integer;
begin
StringList.Add('x');
for i := 1 to 1000000000 do
begin
iPublic := iPublic + StringList.Count;
end;
end;

initialization
StringList := TStringList.Create;
finalization
StringList.Free;

最佳答案

对整数变量同时进行读取/修改/写入操作不会导致异常。

您的代码存在典型的数据竞争条件。但也不会有异常(exception)。使用InterlockedIncrement以避免数据竞争。

对字符串列表使用全局变量是个问题。当两个线程尝试同时使用该单个变量时,会出现异常。该变量应该是局部变量,然后该特定问题得到解决。

关于multithreading - 从多个线程访问公共(public)变量/对象是否会在 Delphi 中产生异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405002/

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