core.thread
thread モジュールはスレッドの作成と管理の機能を提供します。License:
Boost License 1.0. Authors:
Sean Kelly
- threadモジュールの投げる例外の基底クラスです。
- Fiber例外の基底クラスです。
- このクラスはD言語のスレッド関連の全ての機能をカプセル化しています。
スレッドの管理はガベージコレクションの際に必要となるため。
ユーザースレッドは全て必ずこのクラスから派生します。
また、このクラスのインスタンスを明示的にdeleteしないようにしてください。
新しいスレッドは、派生もしくは委譲のどちらの方法でも作成できます。
例を以下に示します。
Example:
class DerivedThread : Thread { this() { super( &run ); } private : void run() { printf( "Derived thread running.\n" ); } } void threadFunc() { printf( "Composed thread running.\n" ); } // それぞれの型のインスタンスを作成 Thread derived = new DerivedThread(); Thread composed = new Thread( &threadFunc ); // 両方を実行開始 derived.start(); composed.start();
- this(void function() fn, size_t sz = 0);
- 静的なDの関数に関連づけて
スレッドオブジェクトを初期化します。
Params:
void function() fn スレッドのメイン関数 size_t sz スレッドのスタックサイズ
In:
fn に null を指定することはできません。
- this(void delegate() dg, size_t sz = 0);
- 動的なDの関数に関連づけて
スレッドオブジェクトを初期化します。
Params:
void delegate() dg スレッドのメイン関数 size_t sz スレッドのスタックサイズ
In:
dg に null を指定することはできません。
- スレッドを開始し、コンストラクタに渡された関数あるいはdelegateを実行します。
In:
この関数はひとつのスレッドインスタンスにつき一度だけ実行できます。
Throws:
スレッドを開始できなかった場合 ThreadException
- スレッドが実行完了するのを待機します。
スレッドが未処理の例外で終了した場合、その例外が再throwされます。
Params:
bool rethrow このスレッドが例外で終了した場合、 例外を再throwします
Throws:
この操作に失敗した場合 ThreadException。 join対象のスレッドで処理されなかった全ての例外。
Returns:
rethrow = false で、処理されなかった例外があった場合その例外オブジェクト。 それ以外の場合は null。
-
- このスレッドの可読性のあるラベルを取得
Returns:
このスレッドの名前
- このスレッドの可読性のあるラベルを取得
- このスレッドの可読性のあるラベルを設定
Params:
string val このスレッドの新しい名前
- このスレッドのデーモン状態フラグを取得します。
ランタイムは、プロセスを落とす前に全ての通常スレッドの実行完了を待ちますが、
デーモンスレッドは無視するため終了タイミングに影響しません。
最終的には、デーモンスレッドはプロセス終了時に
OS によって自動的に終了されます。
Returns:
デーモンスレッドならば true
- このスレッドのデーモン状態フラグを設定します。
ランタイムは、プロセスを落とす前に全ての通常スレッドの実行完了を待ちますが、
デーモンスレッドは無視するため終了タイミングに影響しません。
最終的には、デーモンスレッドはプロセス終了時に
OS によって自動的に終了されます。
Throws:
Params:
bool val スレッドの新しいデーモン状態フラグ
- スレッドが実行中かどうかを調べます。
Returns:
スレッドが実行中ならば true、そうでなければ false
- スレッドに設定できる最低の優先度です。
複数のスケジューリングポリシーが設定できるシステムでは、
この値はプロセスのスケジューリングポリシーの下で
有効な最低の優先度になります。
- スレッドに設定できる最高の優先度です。
複数のスケジューリングポリシーが設定できるシステムでは、
この値はプロセスのスケジューリングポリシーの下で
有効な最高の優先度になります。
- スレッドのスケジューリング優先度を取得します。
Returns:
このスレッドの優先度
- スレッドのスケジューリング優先度を設定します。
Params:
int val このスレッドの新しい優先度
- 呼び出したスレッドを、指定された時間 period の間停止します。
OSのサポートする最大の sleep
時間より長い値を指定した場合、複数回のシステムコール呼び出しとなります。
Params:
long period スレッドを停止したい時間の下限を、 100ナノ秒単位で指定
In:
period は非負の値を指定すること。
Example:
Thread.sleep( 500_000 ); // 50ミリ秒sleep Thread.sleep( 50_000_000 ); // 5秒sleep
- 呼び出したスレッドから強制的にコンテキストスイッチします。
- 呼び出したスレッドへの参照を取得します。
Returns:
呼び出しスレッドを表すスレッドオブジェクト。 この返値をdeleteした場合の挙動は未定義です。
- 現在システムの把握している全スレッドのリストを返します。
Returns:
現在システムの把握している全スレッドへの参照を持った配列を返します。 この配列の要素を delete した場合の挙動は未定義です。
- 現在システムの把握している全スレッドのリストを返します。
Thread オブジェクトを した場合の挙動は未定義です。
Params:
int delegate(ref Thread) dg delegateとして渡されるコード
Returns:
全ての要素をvisitした場合0、それ以外の場合非0。
- スレッドモジュールを初期化します。
この関数はガベージコレクタの起動時に、
他のスレッドルーチンが呼び出される前に実行されなければいけません。
- この関数を呼び出したスレッドをDランタイムでの使用のために登録します。
すでに登録済みのスレッドでこの関数が呼ばれた場合の動作は未定義です。
- この関数を呼び出したスレッドをDランタイムの管理下から外します。
すでに登録解除されたスレッドでこの関数が呼ばれた場合の動作は未定義です。
- 現在実行中の全ての非デーモンスレッドの終了を待機します。
この機能は、繰り返しスレッドリストをスキャンして
デーモンスレッドのみが残るまで待つことで実現されています。
- プロセスがマルチスレッドかどうかを判定するのに使用する関数です。
対象コードがスレッドを開始するおそれがないことを保証できる場合に限り、
この値に基づいて
コードの最適化をすることも可能です。
Returns:
Thread.start() がこのプロセスで呼ばれていた場合 true
- 呼び出しスレッドを除く全てのスレッドを、"stop the world"
GCの実行のために停止します。この関数は複数回呼び出すこともできますが、その場合、
対応する回数分 thread_resumeAll
を呼び出す必要があります。
Throws:
実行中スレッドを suspend できなかった場合 ThreadException
- 呼び出しスレッドを除く全てのスレッドを "stop the world"
GCの実行後に再開します。この関数は、対応する
thread_suspendAll の呼び出し一回につき一回ずつ呼び出す必要があります。
In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。
Throws:
スレッドを resume できなかった場合 ThreadException
- ガベージコレクタのエントリポイントです。指定されたdelegeteには
スタックとレジスタ値の両方を表す範囲が渡されます。
Params:
scanAllThreadsFn scan スキャナ関数。p1 から p2 - 1 までをスキャンするための関数です void* curStackTop 呼び出しスレッドのスタックトップを指す (optional な) ポインタ
In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。
- いくつかのプログラミングテクニックを簡単化するためのクラスです。
- fn を実行するスレッドを作ってスタートし、
グループに追加します。
Params:
void function() fn スレッド関数
Returns:
新しく作られたスレッドへの参照
- dg を実行するスレッドを作ってスタートし、
グループに追加します。
Params:
void delegate() dg スレッド関数
Returns:
新しく作られたスレッドへの参照
- t を、すでにグループに追加済みでなければ、追加します。
Params:
Thread t 追加したいスレッド
In:
t に null は指定できません
- t をグループから削除します。
t がグループに入っていなかった場合は何も起きません。
Params:
Thread t 削除したいスレッド
In:
t に null は指定できません
- グループ内の全てのスレッドに関する操作
- すべてのスレッドをjoinします。
この関数は完了まで add, remove, opApply をブロックします。
Params:
bool rethrow 未処理の例外が発生した場合に、 再throwするかどうかを決めるフラグ
Throws:
join対象のスレッドで処理されなかった例外
- このクラスは、スレッド及びガベージコレクタの機能と統合された、
協調型並行性を提供します。ファイバの呼び出しは、
呼び出したファイバがyieldする (Fiber.yield())
までブロックする操作と考えることができます。実行は呼び出しスレッドのコンテキストで常に行われるため、
同一のスレッドでファイバを呼び出している限りは、
メモリの可視性などのための同期をとる必要がありません。
ファイバが特定のスレッドに所属している必要は特にないことに注意してください。
実行中でないファイバはスレッド間で自由に受け渡すことが可能です。
スレッド同様、新しいファイバは派生もしくは委譲によって作成します。
以下の例をご覧下さい:
Example:
class DerivedFiber : Fiber { this() { super( &run ); } private : void run() { printf( "Derived fiber running.\n" ); } } void fiberFunc() { printf( "Composed fiber running.\n" ); Fiber.yield(); printf( "Composed fiber running.\n" ); } // それぞれの型のインスタンスを作成 Fiber derived = new DerivedFiber(); Fiber composed = new Fiber( &fiberFunc ); // 両方を一度ずつ呼び出す derived.call(); composed.call(); printf( "Execution returned to calling context.\n" ); composed.call(); // どちらも実行完了まで動いているので、TERM 状態になる assert( derived.state == Fiber.State.TERM ); assert( composed.state == Fiber.State.TERM );
Authors:
Mikola Lysenko による設計を元にしています
- this(void function() fn, size_t sz = PAGESIZE);
- 静的なDの関数に関連づけて
ファイバオブジェクトを初期化します。
Params:
void function() fn ファイバで実行する関数 size_t sz ファイバのスタックサイズ
In:
fn に null は指定できません。
- this(void delegate() dg, size_t sz = PAGESIZE);
- 動的なDの関数に関連づけて
ファイバオブジェクトを初期化します。
Params:
void delegate() dg ファイバで実行する関数 size_t sz ファイバのスタックサイズ
In:
dg に null は指定できません。
- このファイバオブジェクトに実行を移します。
呼び出した側のコンテキストは、Fiber.yield() が呼ばれるか、
未処理例外でcallされたファイバが終了するまで、一時停止します。
Params:
bool rethrow 未処理例外があった場合再 throw するかどうかを指定
In:
HOLD 状態のファイバのみを call できます。
Throws:
対象Fiberで処理されなかった例外
Returns:
rethrow = false の場合、(もしあれば)未処理例外オブジェクト。 それ以外の場合は null を返します。
- 再利用できるように、このファイバをリセットします。
すでに終了したファイバに対してのみ使用できます。
それ以外のファイバに対して使うと、scope依存の機能が実行されなくなります。Stack-based
たとえば、終了していないファイバをresetすると、
スタックベースのクラスが正しく解放されません。
In:
TERM 状態のファイバのみを reset できます。
- ファイバは HOLD, EXEC, TERM のいずれかの状態を持ちます。HOLDは、
一度実行がスタートした後一時停止している状態です。
EXECは、現在実行中という状態です。
TERMは、ファイバの実行が終了した状態です。
ファイバの終了後再利用するには、resetを呼び出す必要があります。
- ファイバの現在の状態を返します。
Returns:
enum値で現在の状態を返します
- 強制的にコンテキストスイッチを起こし、呼び出し元のファイバに制御を戻します。
- 強制的にコンテキストスイッチを起こし、
戻った先のファイバで例外tをthrowします。
Params:
Throwable obj throw したいオブジェクト
In:
t に null は指定できません。
- 呼び出したファイバを表す参照を返します。アクティブなファイバが存在しない場合は、
null となります。
Returns:
呼び出したファイバを表す参照を返します。アクティブなファイバが存在しない場合は、 null となります。この返値をdeleteしたときの挙動は未定義です。

コメント
English
ダウンロード
トップ