Skip to content
No description, website, or topics provided.
1C Enterprise
Branch: develop
Clone or download
Pull request Compare This branch is even with nixel2007:develop.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.vscode
src
tests
.gitignore
LICENSE.md
README.md
packagedef

README.md

semaphore

Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода в многопоточной среде.

Классическое использование семафора

// Однопоточный код, стартующий несколько потоков обработки чего-либо
КоличествоПотоков = 3;

Семафор = Новый Семафор(КоличествоПотоков);

// Запуск многопоточного кода
Для сч = 1 По 10 Цикл
    ЗапускОтдельногоПотока(Семафор);
КонецЦикла;

// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока(Семафор)
    ТаймаутОжиданияВМиллисекундах = 1000;
    // Если одновременно выполняющихся потоков больше, чем 3
    // (переменная КоличествоПотоков, с которой создавался семафор),
    // то захват семафора будет ждать освобождения свободного потока.
    // По истечению таймаута вызовется исключение.
    Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);

    // полезная нагрузка...

    Семафор.Освободить();
КонецПроцедуры

Использование пула семафоров

// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока()
    КлючОперации = "Очень важный участок кода, который надо выполнять синхронно";
    КоличествоПотоков = 1;
    // Все потоки, получающие семафоры по ключу операции, получат один и тот же семафор с общим счетчиком.
    Семафор = Семафоры.Получить(КлючОперации, КоличествоПотоков);

    ТаймаутОжиданияВМиллисекундах = 1000;
    Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);

    // полезная нагрузка...

    Семафор.Освободить();
КонецПроцедуры
You can’t perform that action at this time.