Возможно ли или целесообразно реализовать двойную проверку блокировки в Delphi? - PullRequest
7 голосов
/ 08 апреля 2010

Как я знаю, существует два распространенных вида практики для обеспечения безопасности потоков при отложенной инициализации:

  1. Двойная проверка блокировки (помечает переменную как volatile дляизбегайте упорядочения памяти)
  2. InterlockedCompareExchangePointer

Кажется, VCL использует вторую практику.Есть ли какая-то причина?

class function TEncoding.GetUTF8: TEncoding;
var
  LEncoding: TEncoding;
begin
  if FUTF8Encoding = nil then
  begin
    LEncoding := TUTF8Encoding.Create;
    if InterlockedCompareExchangePointer(Pointer(FUTF8Encoding), LEncoding, nil) <> nil then
      LEncoding.Free;
  end;
  Result := FUTF8Encoding;
end;

или есть какой-нибудь лучший способ?

Спасибо!

1 Ответ

4 голосов
/ 08 апреля 2010

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

Когда выполняется инициализация, InterlockedCompareEtc имеет два преимущества перед блокировкой.

  1. Этобыстрее.
  2. Код короче (не нужно инициализировать блокировку и т. д.).

Я нахожу подход InterlockedCompareEtc "аккуратнее" и использую его в своем коде.Но блокировка будет работать одинаково хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...