Потоки
Поддержка потоков для Nim.
Примечание: Это часть модуля системы. Не импортируйте его напрямую. Для активации поддержки потоков необходимо скомпилировать с флагом командной строки --threads:on.
Модель памяти Nim для потоков значительно отличается от других распространённых языков программирования (C, Pascal): каждый поток имеет собственную (управляемую сборкой мусора) кучу, а совместное использование памяти ограничено. Это помогает предотвратить гонки и повышает эффективность. Смотрите руководство для подробностей о этой модели памяти.
Примеры
import locks
var
thr: array[0..4, Thread[tuple[a,b: int]]]
L: Lock
proc threadFunc(interval: tuple[a,b: int]) {.thread.} =
for i in interval.a..interval.b:
acquire(L) # lock stdout
echo i
release(L)
initLock(L)
for i in 0..high(thr):
createThread(thr[i], threadFunc, (i*10, i*10+5))
joinThreads(thr)
deinitLock(L) Типы
Thread*[TArg] = object core: PGcThread sys: SysThread when TArg is void: dataFn: proc () {...}{.nimcall, gcsafe.} else: dataFn: proc (m: TArg) {...}{.nimcall, gcsafe.} data: TArg- Исходный код Редактировать
Процедуры
proc onThreadDestruction*(handler: proc () {...}{.closure, gcsafe, raises: [].})- Регистрирует обработчик локальный для потока, который вызывается при уничтожении потока.
proc running*[TArg](t: Thread[TArg]): bool {...}{.inline.}- Возвращает true, если
tзапущен. Исходный код Редактировать proc handle*[TArg](t: Thread[TArg]): SysThread {...}{.inline.}- Возвращает дескриптор потока
t. Исходный код Редактировать proc joinThread*[TArg](t: Thread[TArg]) {...}{.inline.}- Ожидает завершения потока
t. Исходный код Редактировать proc joinThreads*[TArg](t: varargs[Thread[TArg]])
- Ожидает завершения всех потоков в
t. Исходный код Редактировать proc createThread*[TArg](t: var Thread[TArg]; tp: proc (arg: TArg) {...}{.thread, nimcall.}; param: TArg)-
Создаёт новый поток
tи запускает его выполнение.Точка входа — процедура
Исходный код Редактироватьtp.paramпередаётся вtp.TArgможет бытьvoid, если вам не нужно передавать данные в поток. proc pinToCpu*[Arg](t: var Thread[Arg]; cpu: Natural)
-
Привязывает поток к процессору CPU.
Другими словами, устанавливает аффинити потока. Если вы не знаете, что это значит, не используйте эту процедуру.
Исходный код Редактировать proc createThread*(t: var Thread[void]; tp: proc () {...}{.thread, nimcall.})- Исходный код Редактировать
proc getThreadId*(): int
- Получает идентификатор текущего работающего потока. Исходный код Редактировать
Поток уничтожается, когда процедура .thread возвращается нормально или когда она вызывает исключение. Обратите внимание, что необработанные исключения в потоке всё же приводят к завершению всего процесса.
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/threads.html