问题在于,有时可能会发生一个线程从文件A中读取X,而第二个线程写入同一文件A的X。这会导致问题吗?
I/O代码对每个文件使用TFileStream。我将I/O代码拆分为本地(静态类),因为我担心会出现问题。既然已经拆分了,应该有关键段。
以下每种情况都是未实例化的本地(静态)代码。
procedure Foo(obj:TObject);
begin ... end;
案例二:
procedure Bar(obj:TObject);
var i: integer;
begin
for i:=0 to X do ...{something}
end;
Case 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;
问题1:在什么情况下需要使用临界区,以便多个线程同时调用时不会出现问题?
问题2:如果线程1从文件A中读取X(entry),而线程2将X(entry)写入文件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
finally
file.cs.Leave;
end;
end;
function Write(file: TSpecificFile): TSomeObject;
begin
file.cs.Enter;
try
//write
finally
file.cs.Leave
end;
end;
如果两个线程使用相同的TSpecificFile调用Read会有问题吗?
情况1:相同的TSpecificFile
情况2:不同的TSpecificFile?
我需要另一个关键部分吗?