私はこの分野の専門家ではありませんが、とにかくそれを撃つでしょう。
GHC(Haskellコンパイラ)は、1つまたは複数のHEC(Haskell Execution Context、capまたはcapabilityとも呼ばれます)を持つことができます。ランタイムフラグ+RTS -N <number>
またはsetNumCapabilities
機能を使用すると、プログラムで使用可能なHECの数を定義することができます。 1つのHECが1つのオペレーティングシステムスレッドです。ランタイムスケジューラは、HEC間でHaskell軽量スレッドを分配します。
forkOn
機能では、スレッドが実行されたHECを選択することができます。 getNumCapabilities
は、機能の数(HEC)を返します。
スレッド移行は、Haskellスレッドを別のHECに移行(移動)できることを意味します。ランタイムフラグ+RTS -qm
は、このスレッドの移行を無効にします。
ドキュメントを約forkOn
その
forkIOなどを述べていますが、スレッドが実行すべき機能に指定することができます。 forkOnスレッドとは異なり、forkOnによって作成されたスレッドは、その存続期間全体にわたって同じ機能を維持します(forkIOスレッドはスケジューリングポリシーに従って機能間を移行できます)。
のでforkOn
と、それは1つのHECを選択することが可能ですスレッドがで走っている。
このスレッドによって行われた
外国呼び出しが行われることが保証されていないと述べているforkIO
と比較すると任意の特定のOSスレッドによって。特定のOSスレッドによって外部呼び出しが必要な場合は、代わりにforkOSを使用してください。
今、forkOn
の機能と+RTS -qm
(無効なスレッドの移行)は同じものですか?おそらくそうではありません。 forkOn
を使用すると、ユーザーはHaskellスレッドが実行されているHECを明示的に選択します(たとえば、すべてのHaskellスレッドを同じHECに入れることが可能です)。 +RTS -qm
とforkIO
でHaskellのスレッドがのHECの切り替えはありませんが、HECはforkIO
によって生成されたHaskellのスレッドがで終わるを知る方法はありません
参照を:。