Когда мне следует использовать критические разделы?

Вот в чем дело. В моем приложении много потоков, которые делают одно и то же - считывают определенные данные из огромных файлов (> 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?

Нужен ли мне еще один критический раздел?

5
задан pop32 19 March 2011 в 09:37
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: