threads

Nim におけるスレッドのサポートです。

備考: これは system モジュールの一部です。明示的にインポートしないでください。スレッドのサポートを有効にするにはコマンドラインスイッチ --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) # 標準出力 (stdout) のロック
    echo i
    release(L)

initLock(L)

for i in 0..high(thr):
  createThread(thr[i], threadFunc, (i*10, i*10+5))
joinThreads(thr)

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.})

スレッドの破棄時に呼び出されるスレッド・ローカルのハンドラを登録します。

スレッドは .thread プロシージャ から正常に返されるとき、または例外発生時に破棄されます。スレッドの未処理例外はプロセス全体の異常停止の原因となることに注意してください。

  ソース 編集
proc running*[TArg](t: Thread[TArg]): bool {...}{.inline.}
t が実行中であれば true を返します。  ソース 編集
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 プロシージャです。paramtp へ渡されます。スレッドにデータを渡す必要がないとき、 TArgvoid になります。

  ソース 編集
proc pinToCpu*[Arg](t: var Thread[Arg]; cpu: Natural)

CPU にスレッドをピン留め (割り当て) します。

言い替えればスレッドの有縁性 (thread affinity) を設定します。この意味を知らないなら、このプロシージャは使わないでください。

  ソース 編集
proc createThread*(t: var Thread[void]; tp: proc () {...}{.thread, nimcall.})
  ソース 編集
proc getThreadId*(): int
現在実行しているスレッドの ID を取得します。  ソース 編集