https://github.com/nixel2007/semaphore
https://github.com/nixel2007/semaphore
oscript oscript-lib oscript-package oscript-web semaphore
Last synced: 11 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/nixel2007/semaphore
- Owner: nixel2007
- License: mit
- Created: 2018-11-10T18:13:56.000Z (about 7 years ago)
- Default Branch: develop
- Last Pushed: 2022-02-07T11:51:02.000Z (almost 4 years ago)
- Last Synced: 2024-12-31T20:16:44.120Z (about 1 year ago)
- Topics: oscript, oscript-lib, oscript-package, oscript-web, semaphore
- Language: 1C Enterprise
- Size: 14.6 KB
- Stars: 7
- Watchers: 4
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# semaphore
Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода в многопоточной среде.
## Классическое использование семафора
```bsl
// Однопоточный код, стартующий несколько потоков обработки чего-либо
КоличествоПотоков = 3;
Семафор = Новый Семафор(КоличествоПотоков);
// Запуск многопоточного кода
Для сч = 1 По 10 Цикл
ЗапускОтдельногоПотока(Семафор);
КонецЦикла;
// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока(Семафор)
ТаймаутОжиданияВМиллисекундах = 1000;
// Если одновременно выполняющихся потоков больше, чем 3
// (переменная КоличествоПотоков, с которой создавался семафор),
// то захват семафора будет ждать освобождения свободного потока.
// По истечению таймаута вызовется исключение.
Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);
// полезная нагрузка...
Семафор.Освободить();
КонецПроцедуры
```
## Использование пула семафоров
```bsl
// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока()
КлючОперации = "Очень важный участок кода, который надо выполнять синхронно";
КоличествоПотоков = 1;
// Все потоки, получающие семафоры по ключу операции, получат один и тот же семафор с общим счетчиком.
Семафор = Семафоры.Получить(КлючОперации, КоличествоПотоков);
ТаймаутОжиданияВМиллисекундах = 1000;
Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);
// полезная нагрузка...
Семафор.Освободить();
КонецПроцедуры
```