这是交易.我的应用程序有很多线程做同样的事情 - 从大文件(> 2gb)读取特定数据,解析数据并最终写入该文件.
问题是,有时可能会发生一个线程从文件A读取X并且第二个线程写入同一文件A的X.会出现问题?
I/O代码对每个文件使用TFileStream.我将I/O代码拆分为本地(静态类),因为我担心会出现问题.由于它是分裂的,应该有关键的部分.
下面的每个案例都是未实例化的本地(静态)代码.
情况1:
procedure Foo(obj:TObject);
begin ... end;
Run Code Online (Sandbox Code Playgroud)
案例2:
procedure Bar(obj:TObject);
var i: integer;
begin
for i:=0 to X do ...{something}
end;
Run Code Online (Sandbox Code Playgroud)
案例3:
function Foo(obj:TObject; j:Integer):TSomeObject
var i:integer;
begin
for i:=0 to X do
for j:=0 to Y do
Result:={something}
end;
Run Code Online (Sandbox Code Playgroud)
问题1:在哪种情况下我需要关键部分,以便在> 1个线程同时调用它时没有问题?
问题2:如果线程1从文件A读取X(条目)而线程2写入X(条目)到文件A,是否会出现问题?
我什么时候应该使用关键部分?我试着把它想象成我的脑袋,但它很难 - 只有一个线程:))
编辑
这适合它吗?
{每2GB文件的一个类}
TSpecificFile = class
cs: TCriticalSection;
...
end;
TFileParser = class
file :TSpecificFile;
void Parsethis; void ParseThat....
end;
function Read(file: TSpecificFile): TSomeObject;
begin
file.cs.Enter;
try
...//read …Run Code Online (Sandbox Code Playgroud) type Tmyclass = class(TObject)
somearray: array of TSometype
FBool: Boolean;
Fint: Integer;
Fstr: string;
constructor Create;
destructor Destroy; override;
end;
implementation
constructor Tmyclass.Create;
begin
inherited;
SetLength(somearray,0); //is this needed?
end;
destructor TmyClass.Destroy;
begin
SetLength(somearray,0); //this IS needed!
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
还有什么类型在创建时初始化?例如我在课堂上宣布的内容.FBool被保证是假的吗?是FInt保证是0吗?是Fstr保证是''?
当地情况怎么样?只有字符串?
我使用Delphi XE.
可能重复:
Delphi中Result的默认值是什么
与此问题类似,我现在问以下问题.
function Test:Boolean;
begin end;
Run Code Online (Sandbox Code Playgroud)
结果值是否总是保证为假(0)?整数值不是,布尔值也是如此?