core.thread
thread モジュールはスレッドの作成と管理の機能を提供します。License:
Boost License 1.0. Authors:
Sean Kelly, Walter Bright Source:
core/thread.d
- 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 このスレッドの新しい優先度
- 呼び出したスレッドを、指定された時間の間停止します。
OSのサポートする最大の sleep
時間より長い値を指定した場合、複数回のシステムコール呼び出しとなります。
Parameters:
In:Duration val スレッドを停止したい時間の下限
非負の値を指定すること。 Example:
Thread.sleep( dur!("msecs")( 50 ) ); // 50ミリ秒sleep Thread.sleep( dur!("seconds")( 5 ) ); // 5秒sleep
- 呼び出したスレッドを、指定された時間 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。
Thread.ThreadAddr addr | 検索したいスレッドID |
スレッド識別子に関連付いたスレッドオブジェクト。見つからなければ null
Returns:
Thread.start() がこのプロセスで呼ばれていた場合 true
Throws:
実行中スレッドを suspend できなかった場合 ThreadException
In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。
Throws:
スレッドを resume できなかった場合 ThreadException
Params:
scanAllThreadsFn scan | スキャナ関数。p1 から p2 - 1 までをスキャンするための関数です |
void* curStackTop | 呼び出しスレッドのスタックトップを指す (optional な) ポインタ |
In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。
全てのスレッドをresumeする直前にこのルーチンを呼ぶ必要があります。
- 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対象のスレッドで処理されなかった例外
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したときの挙動は未定義です。