C# C#  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Сложный  · 

Потоки и синхронизация

Проверяет потоки, lock, SemaphoreSlim, атомарные операции и состояния гонки. Вопросы построены вокруг реального совместного состояния: нужно найти окно гонки, выбрать подходящий примитив и не спутать взаимное исключение с ограничением параллелизма.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 25
Что делает Thread.Start?
C#
var thread = new Thread(() => Console.Write("worker"));
thread.Start();
thread.Join();
Вопрос 2 из 25
Чем background thread отличается при завершении процесса?
Вопрос 3 из 25
Почему Thread.Sleep не делает I/O масштабируемым?
C#
Thread.Sleep(1000);       // поток занят ожиданием
await Task.Delay(1000);     // поток может обслужить другую работу
Вопрос 4 из 25
Когда выделенный Thread может быть оправдан?
Вопрос 5 из 25
Почему сбой RunLoop нельзя наблюдать через Task, создавшую этот поток?
C#
var thread = new Thread(RunLoop);
thread.Start();
Вопрос 6 из 25
Что гарантирует lock для одного gate?
Вопрос 7 из 25
Почему gate обычно private readonly object?
C#
private readonly object _gate = new();

public void Add(Item item)
{
    lock (_gate) _items.Add(item);
}
Вопрос 8 из 25
Можно ли написать await внутри lock?
Вопрос 9 из 25
Почему lock(this) опасен в публичном классе?
C#
public void Update()
{
    lock (this)
    {
        Recalculate();
    }
}
Вопрос 10 из 25
Что означает reentrant lock в .NET?
Вопрос 11 из 25
Что означает new SemaphoreSlim(3, 3)?
Вопрос 12 из 25
Почему Release должен быть в finally?
C#
await gate.WaitAsync(token);
try
{
    await UseResourceAsync(token);
}
finally
{
    gate.Release();
}
Вопрос 13 из 25
Чем SemaphoreSlim(1,1) отличается от lock в async-коде?
Вопрос 14 из 25
Что случится при лишнем Release сверх maxCount?
C#
var gate = new SemaphoreSlim(1, 1);
gate.Release(); // начальный счётчик уже равен максимуму
Вопрос 15 из 25
Как ограничить обращения к API, но не держать разрешение во время локальной обработки ответа?
C#
Response response;
await apiGate.WaitAsync(token);
try { response = await api.CallAsync(token); }
finally { apiGate.Release(); }
return Parse(response);
Вопрос 16 из 25
Почему counter++ теряет обновления?
C#
Parallel.For(0, 100_000, _ => counter++);
Вопрос 17 из 25
Как атомарно увеличить int?
Вопрос 18 из 25
Почему ContainsKey затем TryAdd не образуют единую атомарную проверку?
Вопрос 19 из 25
Может ли factory в ConcurrentDictionary.GetOrAdd выполниться несколько раз для одного ключа?
C#
var value = cache.GetOrAdd(key, _ => CreateExpensive());
Вопрос 20 из 25
Что решает volatile для поля?
Вопрос 21 из 25
Как сделать окно гонки воспроизводимым?
C#
var barrier = new Barrier(2);
Task Worker() => Task.Run(() => {
    var observed = value;
    barrier.SignalAndWait();
    value = observed + 1;
});
Вопрос 22 из 25
Что измерять у блокировки под нагрузкой?
Вопрос 23 из 25
Как диагностировать deadlock процесса .NET?
BashКоманды диагностики
dotnet-dump collect -p <pid> -o deadlock.dmp
dotnet-dump analyze deadlock.dmp
# В анализаторе: clrthreads, clrstack, syncblk
Вопрос 24 из 25
Почему тест только на ConcurrentDictionary недостаточен для операции перевода денег?
Вопрос 25 из 25
Какой стресс-тест полезен после детерминированного?
C#
for (var run = 0; run < 1_000; run++)
{
    var account = new Account(1_000);
    await RunConcurrentTransfers(account);
    Assert.Equal(1_000, account.TotalAcrossBuckets);
}

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

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

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

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