多线程/进程tstringlist.add操作需要同步吗?

时间:2022-11-12 18:09:19
多线程/进程tstringlist.add操作需要同步吗?

同时删除/添加肯定要同步吧。
但我的程序仅仅有 tstringlist.add 操作。不用同步可以吧?探讨下!

11 个解决方案

#1


不排序的话没问题

#2


只有添加,不删除,或是取值的话没什么问题。

#3


只存在添加的话,不用

#4


多线程操作list使用TThreadList,里面有lock/unlock方法

#5


总需要取值的吧?还是需要同步

#6


添加的时候要同步

#7


Add 作为并发写..不需要同步? 不太可能...

#8


经测试,不用同步。一点问题都没!



unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
    Tmythead = class( TThread )
    private
      FStr : string;
    protected
      { Protected declarations }
      procedure Execute; override;
    public
      { Public declarations }
      constructor Create(CreateSuspended: Boolean = false; AStr:String = 't1');
    end;

implementation

uses
  Unit1;

{ TThreadEWB }

constructor Tmythead.Create(CreateSuspended: Boolean; AStr:String);
begin
  FStr := AStr;
  FreeOnTerminate := true;
  inherited Create(CreateSuspended);
end;

procedure Tmythead.Execute;
var
  i : integer;
begin
  i := 0;
  while i < 5000 do
    begin
      Unit1.sl1.Duplicates := dupIgnore;
      Unit1.sl1.Add(FStr + ' : ' + inttostr(i));
      inc(i);
    end;
  Form1.Memo1.Lines.Add('完成 : ' + FStr);
end;

end.

#9


你这样测试能测试出来么? 
就一个线程在这里跑 ,里边不过就一个循环 

#10


还有代码没发!

procedure TForm1.Button6Click(Sender: TObject);
var
  t1, t2, t3, t4, t5, t6 : Tmythead;
begin
  sl1 := TStringList.Create;
  t1 := Tmythead.Create(false, 't1');
  t2 := Tmythead.Create(false, 't2');
  t3 := Tmythead.Create(false, 't3');
  t4 := Tmythead.Create(false, 't4');
  t5 := Tmythead.Create(false, 't5');
  t6 := Tmythead.Create(false, 't6');
end;

#11


TStringList.Add操作必须要处理同步,具体操作,参考4楼大侠的意见

研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上

#1


不排序的话没问题

#2


只有添加,不删除,或是取值的话没什么问题。

#3


只存在添加的话,不用

#4


多线程操作list使用TThreadList,里面有lock/unlock方法

#5


总需要取值的吧?还是需要同步

#6


添加的时候要同步

#7


Add 作为并发写..不需要同步? 不太可能...

#8


经测试,不用同步。一点问题都没!



unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
    Tmythead = class( TThread )
    private
      FStr : string;
    protected
      { Protected declarations }
      procedure Execute; override;
    public
      { Public declarations }
      constructor Create(CreateSuspended: Boolean = false; AStr:String = 't1');
    end;

implementation

uses
  Unit1;

{ TThreadEWB }

constructor Tmythead.Create(CreateSuspended: Boolean; AStr:String);
begin
  FStr := AStr;
  FreeOnTerminate := true;
  inherited Create(CreateSuspended);
end;

procedure Tmythead.Execute;
var
  i : integer;
begin
  i := 0;
  while i < 5000 do
    begin
      Unit1.sl1.Duplicates := dupIgnore;
      Unit1.sl1.Add(FStr + ' : ' + inttostr(i));
      inc(i);
    end;
  Form1.Memo1.Lines.Add('完成 : ' + FStr);
end;

end.

#9


你这样测试能测试出来么? 
就一个线程在这里跑 ,里边不过就一个循环 

#10


还有代码没发!

procedure TForm1.Button6Click(Sender: TObject);
var
  t1, t2, t3, t4, t5, t6 : Tmythead;
begin
  sl1 := TStringList.Create;
  t1 := Tmythead.Create(false, 't1');
  t2 := Tmythead.Create(false, 't2');
  t3 := Tmythead.Create(false, 't3');
  t4 := Tmythead.Create(false, 't4');
  t5 := Tmythead.Create(false, 't5');
  t6 := Tmythead.Create(false, 't6');
end;

#11


TStringList.Add操作必须要处理同步,具体操作,参考4楼大侠的意见

研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上