线程类 数据成员是否安全的问题,大量线程并发时私有数据成员会不会混乱? ( 积分: 20 )

  • 主题发起人 主题发起人 行到水穷处
  • 开始时间 开始时间

行到水穷处

Unregistered / Unconfirmed
GUEST, unregistred user!
大家看下面线程类的私有变量,是否安全!
在 procedure Execute;override;
中 调用 Scan过程 改变success等变量值
随后调用 procedure AppendResult 向一个公用数据集追加数据(同步)
AppendResult使用了大部分私有变量尤其是Success,timeout等值。
问题是:大批量的线程并发,这些Success,timeout会不会不安全(混乱)?

type
TScanThread=class(TThread)
private
Host,Protocol: string;
Port: Integer;
StartTime: string;
Success: integer;
Interval : integer;
TimeOut: integer;
ResultNum,TotalRunNum : integer;
function GetScanMessage: Boolean;
function Scan:integer;
procedure AppendResult;//这里调用Thread私有变量(Host,Protocol,Success,StartTime,TimeOut),安全吗?
protected
procedure Execute;override;
procedure ThreadDone(Sender : TObject);
public
constructor Create();
end;


constructor TScanThread.Create();
begin
inherited Create(True);
OnTerminate:=ThreadDone;
FreeOnTerminate:=True;
end;
 
大家看下面线程类的私有变量,是否安全!
在 procedure Execute;override;
中 调用 Scan过程 改变success等变量值
随后调用 procedure AppendResult 向一个公用数据集追加数据(同步)
AppendResult使用了大部分私有变量尤其是Success,timeout等值。
问题是:大批量的线程并发,这些Success,timeout会不会不安全(混乱)?

type
TScanThread=class(TThread)
private
Host,Protocol: string;
Port: Integer;
StartTime: string;
Success: integer;
Interval : integer;
TimeOut: integer;
ResultNum,TotalRunNum : integer;
function GetScanMessage: Boolean;
function Scan:integer;
procedure AppendResult;//这里调用Thread私有变量(Host,Protocol,Success,StartTime,TimeOut),安全吗?
protected
procedure Execute;override;
procedure ThreadDone(Sender : TObject);
public
constructor Create();
end;


constructor TScanThread.Create();
begin
inherited Create(True);
OnTerminate:=ThreadDone;
FreeOnTerminate:=True;
end;
 
當然安全,每次調用它產生的是不同的實例.
 
如果是每个线程独立完成,使用内部的变量的话,应该是没有问题的。
 
同意leaber,每个线程对象只操作自己的私有成员是没有问题的。
 
function GetScanMessage: Boolean;
是用来获取扫描成员变量的,改变内部类似host,port,protocol等信息。
线程类似一个线程池的工作线程,只在必要的时候销毁
不断的用GetScanMessage更改host,port,protocol等信息 然后调用Scan 改变Success等信息,然后追加扫描结果。
这其中不会混乱数据把?
 
不会
不同实力
不同空间的
 
当然不会,每个对象有每个对象自己的空间~
 
多人接受答案了。
 
后退
顶部