DP Delphi / Pascal  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Блокировки и конкурентный доступ

Этот тест проверяет не память на названия, а способность разбирать код, видеть границы механизма и выбирать исправление, которое не ломает соседние сценарии. Внутри 30 вопросов, из них 18 с фрагментами Object Pascal. Отдельные результаты показываются по разделам: «Критические секции», «Мониторы», «Очереди», «Взаимные блокировки», «Профилирование решения» и «Архитектурные компромиссы».

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На весь тест отведено 85 минут. Код лучше сначала разобрать вручную: правильный вариант должен объяснять механизм, а не только совпадать с одним запуском.
Вопрос 1 из 30
В `CriticalInvariant` сначала встречается `if Balance + Delta < 0 then Exit;`, а затем `Lock.Release;`. Какой вывод можно сделать только после чтения обеих строк?
PascalDelphi / Pascal · Критические секции
// Отделите правило языка от удачного запуска CriticalInvariant.
program CriticalInvariant;
uses System.SyncObjs;
var Lock: TCriticalSection; Balance: Integer;
procedure Transfer(Delta: Integer);
begin
  Lock.Acquire;
  try
    if Balance + Delta < 0 then Exit;
    Inc(Balance, Delta);
  finally
    Lock.Release;
  end;
end;
begin end.
Вопрос 2 из 30
Две реализации темы «Мониторы» совпадают на обычном примере. Какое различие всё же меняет их договор? Сопоставьте обычный путь и изменение состояния.
Вопрос 3 из 30
В практическом сценарии по теме «Очереди» меняются входные данные и порядок действий. Какой вывод остаётся корректным? Сопоставьте обычный путь и изменение состояния.
Вопрос 4 из 30
Две реализации темы «Взаимные блокировки» совпадают на обычном примере. Какое различие всё же меняет их договор? Сопоставьте обычный путь и изменение состояния.
Вопрос 5 из 30
В теме «Профилирование решения» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 6 из 30
Какую модель конкурентного доступа выражает разделение `Enqueue` и `ProcessAll` в `MessageOwner`?
PascalDelphi / Pascal · Архитектурные компромиссы
// Много потоков могут помещать сообщения в потокобезопасную очередь; итог меняет один владелец.
program MessageOwner;
{$APPTYPE CONSOLE}
uses System.Generics.Collections, System.SysUtils, System.Types;
type
  TStateOwner = class
  private
    FPending: TThreadedQueue<Integer>;
    FTotal: Integer;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Enqueue(Value: Integer);
    procedure ProcessAll;
  end;
constructor TStateOwner.Create;
begin
  inherited;
  FPending := TThreadedQueue<Integer>.Create(100, 0, 0);
end;
destructor TStateOwner.Destroy;
begin
  FPending.Free;
  inherited;
end;
procedure TStateOwner.Enqueue(Value: Integer);
begin
  if FPending.PushItem(Value) <> wrSignaled then
    raise EInvalidOpException.Create('queue is full');
end;
procedure TStateOwner.ProcessAll;
var
  Value: Integer;
begin
  while FPending.PopItem(Value) = wrSignaled do
    Inc(FTotal, Value);
  Writeln(FTotal);
end;
var
  Owner: TStateOwner;
begin
  Owner := TStateOwner.Create;
  try
    Owner.Enqueue(2);
    Owner.Enqueue(3);
    Owner.ProcessAll;
  finally
    Owner.Free;
  end;
end.
Вопрос 7 из 30
Обычный пример по теме «Критические секции» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник? Сопоставьте обычный путь и изменение состояния.
Вопрос 8 из 30
Реализацию темы «Мониторы» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться? Сопоставьте обычный путь и изменение состояния.
Вопрос 9 из 30
Обычный пример по теме «Очереди» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник? Сопоставьте обычный путь и изменение состояния.
Вопрос 10 из 30
В теме «Взаимные блокировки» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 11 из 30
Что именно измеряет `Watch.ElapsedTicks` в показанном одиночном вызове `ReadShared`?
PascalDelphi / Pascal · Профилирование решения
// Проследите фактическое поведение ContentionMeasure.
program ContentionMeasure;
uses System.Diagnostics, System.SyncObjs;
var
  Lock: TCriticalSection;
  Watch: TStopwatch;
procedure ReadShared;
begin
  Watch := TStopwatch.StartNew;
  Lock.Acquire;
  try
    Writeln('wait ticks=', Watch.ElapsedTicks);
  finally
    Lock.Release;
  end;
end;
begin
  Lock := TCriticalSection.Create;
  try
    ReadShared;
  finally
    Lock.Free;
  end;
end.
Вопрос 12 из 30
В практическом сценарии по теме «Архитектурные компромиссы» меняются входные данные и порядок действий. Какой вывод остаётся корректным? Сопоставьте обычный путь и изменение состояния.
Вопрос 13 из 30
Правка по теме «Критические секции» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 14 из 30
Какой сценарий по теме «Мониторы» отличит исправную реализацию от версии со скрытым дефектом? Сопоставьте обычный путь и изменение состояния.
Вопрос 15 из 30
В теме «Очереди» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 16 из 30
Как из порядка захвата блокировок в `First` и `Second` возникает взаимная блокировка, если оба потока доходят до второй `Acquire` одновременно?
PascalDelphi / Pascal · Взаимные блокировки
// Проследите фактическое поведение LockOrder.
program LockOrder;
uses System.SyncObjs;
var A, B: TCriticalSection;
procedure First;
begin
  A.Acquire;
  try
    B.Acquire;
    try { update both } finally B.Release; end;
  finally A.Release; end;
end;
procedure Second;
begin
  B.Acquire;
  try
    A.Acquire;
    try { update both } finally A.Release; end;
  finally B.Release; end;
end;
begin end.
Вопрос 17 из 30
Реализацию темы «Профилирование решения» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться? Сопоставьте обычный путь и изменение состояния.
Вопрос 18 из 30
Обычный пример по теме «Архитектурные компромиссы» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник? Сопоставьте обычный путь и изменение состояния.
Вопрос 19 из 30
Какое свойство темы «Критические секции» становится решающим на граничном входе или при другом порядке действий? Сопоставьте обычный путь и изменение состояния.
Вопрос 20 из 30
В теме «Мониторы» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 21 из 30
Две версии `BoundedQueue` сохраняют порядок `FQueue := TThreadedQueue<string>.Create(100, 1000, 1000);` → `destructor TWorkQueue.Destroy;`. Какое свойство останется общим для обеих?
PascalDelphi / Pascal · Очереди
// Определите реальную гарантию в BoundedQueue.
program BoundedQueue;
uses System.Generics.Collections, System.SyncObjs;
type
  TWorkQueue = class
    FQueue: TThreadedQueue<string>;
  public
    constructor Create;
    destructor Destroy; override;
  end;
constructor TWorkQueue.Create;
begin
  FQueue := TThreadedQueue<string>.Create(100, 1000, 1000);
end;
destructor TWorkQueue.Destroy;
begin
  FQueue.DoShutDown;
  FQueue.Free;
  inherited;
end;
begin end.
Вопрос 22 из 30
Правка по теме «Взаимные блокировки» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 23 из 30
Модуль, использующий тему «Профилирование решения», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре? Сопоставьте обычный путь и изменение состояния.
Вопрос 24 из 30
Правка по теме «Архитектурные компромиссы» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 25 из 30
Для темы «Критические секции» готовят регрессионный набор из двух разных сценариев. Какой набор действительно закрывает обе границы?
Вопрос 26 из 30
Какой граничный результат следует ожидать в `MonitorWait`, когда после `TMonitor.Enter(Gate);` выполняется `TMonitor.Exit(Gate);`?
PascalDelphi / Pascal · Мониторы
// Определите реальную гарантию в MonitorWait.
program MonitorWait;
var
  Gate: TObject;
  Ready: Boolean;
procedure WaitReady;
begin
  TMonitor.Enter(Gate);
  try
    while not Ready do
      TMonitor.Wait(Gate);
  finally
    TMonitor.Exit(Gate);
  end;
end;
procedure SignalReady;
begin
  TMonitor.Enter(Gate);
  try
    Ready := True;
    TMonitor.PulseAll(Gate);
  finally
    TMonitor.Exit(Gate);
  end;
end;
begin
  Gate := TObject.Create;
  try
    SignalReady;
    WaitReady;
  finally
    Gate.Free;
  end;
end.
Вопрос 27 из 30
Модуль, использующий тему «Очереди», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре? Сопоставьте обычный путь и изменение состояния.
Вопрос 28 из 30
Какое свойство темы «Взаимные блокировки» становится решающим на граничном входе или при другом порядке действий? Сопоставьте обычный путь и изменение состояния.
Вопрос 29 из 30
Модуль, использующий тему «Профилирование решения», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре? Сопоставьте обычный путь и изменение состояния. Рассмотрите вариант, где меняется состояние, но внешний интерфейс остаётся прежним.
Вопрос 30 из 30
В теме «Архитектурные компромиссы» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу