Изменен: 07.02.2022 12:02:17
Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода.
Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода в многопоточной среде.
// Однопоточный код, стартующий несколько потоков обработки чего-либо
КоличествоПотоков = 3;
Семафор = Новый Семафор(КоличествоПотоков);
// Запуск многопоточного кода
Для сч = 1 По 10 Цикл
ЗапускОтдельногоПотока(Семафор);
КонецЦикла;
// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока(Семафор)
ТаймаутОжиданияВМиллисекундах = 1000;
// Если одновременно выполняющихся потоков больше, чем 3
// (переменная КоличествоПотоков, с которой создавался семафор),
// то захват семафора будет ждать освобождения свободного потока.
// По истечению таймаута вызовется исключение.
Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);
// полезная нагрузка...
Семафор.Освободить();
КонецПроцедуры
// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока()
КлючОперации = "Очень важный участок кода, который надо выполнять синхронно";
КоличествоПотоков = 1;
// Все потоки, получающие семафоры по ключу операции, получат один и тот же семафор с общим счетчиком.
Семафор = Семафоры.Получить(КлючОперации, КоличествоПотоков);
ТаймаутОжиданияВМиллисекундах = 1000;
Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);
// полезная нагрузка...
Семафор.Освободить();
КонецПроцедуры