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