Здравствуйте, netch80, Вы писали:
N>Какие есть варианты сделать это красиво без подобных ручных плясок?
Этот паттерн называется
monitor.
Его красота в том, что он концептуально изолирован от типов данных, над которыми производится операция. Это может быть простая переменная, контейнер, всё что угодно что имеет изменяемое состояние.
Приведу пример как такая конструкция делается в C#:
Queue<int> jobs = new();
void AddJob(int job)
{
lock (jobs)
{
// Добавляем задачу в очередь.
jobs.Enqueue(job);
// Сигнализируем о добавлении задачи.
Monitor.Pulse(jobs);
}
}
int GetJob()
{
lock (jobs)
{
// Ждем появления задач.
while (jobs.Count == 0)
Monitor.Wait(jobs);
// Забираем задачу из очереди.
return jobs.Dequeue();
}
}
Как видно из кода, никакого ручного освобождения. Все эти подоперации удобно интегрированы в высокоуровневые операции монитора.