Spec-Zone.ru › Nim 1

Потоки

Поддержка потоков для 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: [].})
Регистрирует обработчик локальный для потока, который вызывается при уничтожении потока.

Поток уничтожается, когда процедура .thread возвращается нормально или когда она вызывает исключение. Обратите внимание, что необработанные исключения в потоке всё же приводят к завершению всего процесса.

Исходный код Редактировать
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
Получает идентификатор текущего работающего потока. Исходный код Редактировать

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/threads.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API