Вот в чем дело. В моем приложении много потоков, которые делают одно и то же - считывают определенные данные из огромных файлов (> 2 ГБ), анализируют данные и в конечном итоге записывают в этот файл.
Проблема в том, что иногда может случиться так, что один поток читает X из файла A, а второй поток записывает в X того же файла A. Проблема может возникнуть?
Код ввода-вывода использует TFileStream для каждого файла. Я разделяю код ввода-вывода на локальный (статический класс), потому что боюсь, что возникнет проблема. Поскольку он разделен, в нем должны быть критические секции.
Каждый случай ниже - это локальный (статический) код, который не создается.
Случай 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 считывает X (запись) из файла A, а поток 2 записывает в X (запись) в файл A?
Когда мне следует использовать критические секции? Я пытаюсь представить это своей головой, но это сложно - только одна нить: ))
РЕДАКТИРОВАТЬ
Это подойдет?
{класс для каждого файла размером 2 ГБ}
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 с:
case 1: same TSpecificFile
случай 2: другой TSpecificFile?
Нужен ли мне еще один критический раздел?