Spec-Zone.ru › Nim

std/typedthreads

Источник Редактировать

Поддержка потоков в Nim. Потоки позволяют нескольким функциям выполняться одновременно.

В Nim потоки являются низкоуровневой конструкцией, и рекомендуется использование библиотеки, такой как malebolgia, taskpools или weave.

При создании потока вы можете передавать в него аргументы. Поскольку сборщик мусора Nim не использует атомные ссылки, совместное использование ref и других переменных, управляемых сборщиком мусора, между потоками не поддерживается. Для этого используйте глобальные переменные или указатели.

Память, выделенная с помощью `sharedAlloc`, может использоваться и делиться между потоками.

Для взаимодействия между потоками рассмотрите использование каналов

Примеры

import std/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)

При использовании стратегии управления памятью, поддерживающей общие кучи, такие как arc или boehm, вы можете передавать указатели в потоки и совместно использовать память между ними, но память должна существовать дольше, чем поток. По умолчанию используется стратегия управления памятью orc, которая поддерживает это. Приведенный ниже пример недействителен для стратегий управления памятью, использующих локальные кучи, такие как refc!

import locks

var l: Lock

proc threadFunc(obj: ptr seq[int]) {.thread.} =
  withLock l:
    for i in 0..<100:
      obj[].add(obj[].len * obj[].len)

proc threadHandler() =
  var thr: array[0..4, Thread[ptr seq[int]]]
  var s = newSeq[int]()
  
  for i in 0..high(thr):
    createThread(thr[i], threadFunc, s.addr)
  joinThreads(thr)
  echo s

initLock(l)
threadHandler()
deinitLock(l)

Импорты

threadtypes, ansi_c

Процедуры

proc createThread(t: var Thread[void]; tp: proc () {.thread, nimcall.}) {.
    ...raises: [ResourceExhaustedError], tags: [], forbids: [].}
Источник Редактировать
proc createThread[TArg](t: var Thread[TArg];
                        tp: proc (arg: TArg) {.thread, nimcall.}; param: TArg)

Создает новый поток t и запускает его выполнение.

Точкой входа является процедура tp. param передается в tp. TArg может быть void, если вам не нужно передавать какие-либо данные в поток.

Источник Редактировать
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 pinToCpu[Arg](t: var Thread[Arg]; cpu: Natural)

Привязывает поток к процессору.

Другими словами, задаёт сродство потока. Если вы не знаете, что это значит, вам не следует использовать эту процедуру.

Источник Редактировать
proc running[TArg](t: Thread[TArg]): bool {.inline.}
Возвращает true, если t выполняется. Источник Редактировать

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

Spec-Zone.ru

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