Нужен ли критический раздел, чтобы получить индекс значения в строковом списке?


У меня есть stringlist myStringList С примерно 100 значениями, и я делаю асинхронный доступ к нему.Я хотел бы знать, является ли это потокобезопасным, чтобы сделать это :

currentIndex := myStringList.IndexOf(wantedValue);

Или мне всегда приходится это делать:

criticalS.Enter;
try
  currentIndex := myStringList.IndexOf(wantedValue);
finally
  criticalS.Leave;
end;
3 5

3 ответа:

Вам абсолютно необходимо использовать блокировку, чтобы защитить весь доступ к изменяемому списку строк. Если поток записи изменяет список во время чтения вашего потока, код может завершиться ошибкой. Вы можете сослаться на строку, которая была уничтожена. Или список может быть перераспределен по другому адресу, пока вы его читаете.

Вы должны использовать одну и ту же блокировку для всех видов доступа, как для чтения, так и для записи. Вы можете использовать несколько блокировок чтения и записи, а не критическую секцию. Но тебе это нужно синхронизация какой-то формы.

Если все потоки читают из списка, и ни один поток не изменяет его каким-либо образом, то вам не нужна блокировка.

Вот очень хороший потокобезопасный TStringList, который я очень успешно использовал.

TThreadStringList by Tilo Eckert http://www.swissdelphicenter.ch/torry/showcode.php?id=2167

Он очень ясно демонстрирует технику критического сечения.

Если вы не манипулируете строками (add / insert/remove) из любого другого потока (то есть данные есть, и они статичны), нет необходимости в блокировке.