これが取引です。私のアプリには、同じことを行うスレッドがたくさんあります-巨大なファイル(> 2GB)から特定のデータを読み取り、データを解析し、最終的にそのファイルに書き込みます。
問題は、1 つのスレッドがファイル A から X を読み取り、2 番目のスレッドが同じファイル A の X に書き込むことが時々発生する可能性があることです。問題は発生しますか?
I/O コードは、すべてのファイルに TFileStream を使用します。問題が発生するのではないかと心配して、I/O コードをローカル (静的クラス) に分割しました。分割されているため、重要なセクションがあるはずです。
以下のすべてのケースは、インスタンス化されていないローカル (静的) コードです。
ケース 1:
procedure Foo(obj:TObject);
begin ... end;
ケース 2:
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(エントリ) を読み取り、スレッド 2 がファイル A の X(エントリ) に書き込む場合、問題は発生しますか?
クリティカル セクションはいつ使用する必要がありますか? 私はそれを私の頭で想像しようとしますが、それは難しいです-スレッドは1つだけです:))
編集
これで合っているでしょうか?
{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;
2 つのスレッドが Read を呼び出した場合、問題が発生します:
ケース 1: 同じ TSpecificFile
ケース 2: 異なる TSpecificFile?
別のクリティカル セクションが必要ですか?