delphi多線程如果使用對於變量的訪問會出現安全的問題。對於局部變量與對象內部變量,每個線程對象都會有拷貝,因此不會相互干擾,但是如果訪問的是全局變量呢? 那麼就會出現問題,全局變量的值就會無法確定。我們看一下列子 [delphi] unit ThreadCopy; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) btn1: TButton; edt1: TEdit; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} threadvar GlobalStr : string; type TTLSThread=class(TThread) private FNewStr : string; protected procedure Execute;override; public constructor Create(const ANewStr : string); end; procedure SetGlobalStr(str : string); begin if str=' ' then messagebox(0,PChar(GlobalStr),'this str is..',MB_OK) else GlobalStr:=str; end; { TTLSThread } constructor TTLSThread.Create(const ANewStr: string); begin FNewStr:=ANewStr; inherited Create(False); end; procedure TTLSThread.Execute; begin FreeOnTerminate:=True; SetGlobalStr(FNewStr); SetGlobalStr(' '); end; procedure TForm1.btn1Click(Sender: TObject); begin SetGlobalStr('hello'); SetGlobalStr(' '); TTLSThread.Create('DilBret'); Sleep(100); SetGlobalStr(' '); end; end. 全局變量 GlobalStr 使用的threadvar進行的定義,那麼這樣定義會有什麼好處呢?如果定義為threadvar那麼當線程訪問GlobalStr 時,並不是使用GlobalStr,而是使用GlobalStr 的拷貝,因此並不會影響其他線程的訪問。大家可以嘗試運行上面的代碼。