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