这是交易。我的应用程序有很多线程做同样的事情 - 从大文件(> 2gb)中读取特定数据,解析数据并最终写入该文件。
问题是有时可能会发生一个线程从文件 A 读取 X,而第二个线程写入同一个文件 A 的 X。会发生问题吗?
I/O 代码对每个文件使用 TFileStream。我将 I/O 代码拆分为本地(静态类),因为我担心会有问题。既然是分裂的,就应该有临界区。
下面的每个案例都是未实例化的本地(静态)代码。
情况1:
procedure Foo(obj:TObject);
begin ... end;
案例二:
procedure Bar(obj:TObject);
var i: integer;
begin
for i:=0 to X do ...{something}
end;
案例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:在哪种情况下我需要临界区,所以如果>1个线程同时调用它就没有问题?
问题 2:如果线程 1 从文件 A 中读取 X(entry),而线程 2 向文件 A 写入 X(entry),会不会有问题?
什么时候应该使用临界区?我试着把它想象成我的脑袋,但这很难——只有一个线程:))
编辑
这会适合它吗?
{每 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;
现在如果两个线程调用 Read 会出现问题:
案例 1:相同的 TSpecificFile
案例2:不同的TSpecificFile?
我需要另一个关键部分吗?