D 1.0   D 2.0
About Japanese Translation

Last update Thu Feb 17 14:20:02 2011

core.thread

thread モジュールはスレッドの作成と管理の機能を提供します。

License:
Boost License 1.0.

Authors:
Sean Kelly, Walter Bright

Source:
core/thread.d

class ThreadException: object.Exception;
threadモジュールの投げる例外の基底クラスです。
class FiberException: object.Exception;
Fiber例外の基底クラスです。
alias btex_fptr;


class Thread;
このクラスは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:
fnnull を指定することはできません。
this(void delegate() dg, size_t sz = 0);
動的なDの関数に関連づけて スレッドオブジェクトを初期化します。

Params:
void delegate() dg スレッドのメイン関数
size_t sz スレッドのスタックサイズ

In:
dgnull を指定することはできません。

final void start();
スレッドを開始し、コンストラクタに渡された関数あるいはdelegateを実行します。

In:
この関数はひとつのスレッドインスタンスにつき一度だけ実行できます。

Throws:
スレッドを開始できなかった場合 ThreadException

final Throwable join(bool rethrow = true);
スレッドが実行完了するのを待機します。 スレッドが未処理の例外で終了した場合、その例外が再throwされます。

Params:
bool rethrow このスレッドが例外で終了した場合、 例外を再throwします

Throws:
この操作に失敗した場合 ThreadException。 join対象のスレッドで処理されなかった全ての例外。

Returns:
rethrow = false で、処理されなかった例外があった場合その例外オブジェクト。 それ以外の場合は null

final string name();
このスレッドの可読性のあるラベルを取得

Returns:
このスレッドの名前

final void name(string val);
このスレッドの可読性のあるラベルを設定

Params:
string val このスレッドの新しい名前

final bool isDaemon();
このスレッドのデーモン状態フラグを取得します。 ランタイムは、プロセスを落とす前に全ての通常スレッドの実行完了を待ちますが、 デーモンスレッドは無視するため終了タイミングに影響しません。 最終的には、デーモンスレッドはプロセス終了時に OS によって自動的に終了されます。

Returns:
デーモンスレッドならば true

final void isDaemon(bool val);
このスレッドのデーモン状態フラグを設定します。 ランタイムは、プロセスを落とす前に全ての通常スレッドの実行完了を待ちますが、 デーモンスレッドは無視するため終了タイミングに影響しません。 最終的には、デーモンスレッドはプロセス終了時に OS によって自動的に終了されます。

Throws:
Params:
bool val スレッドの新しいデーモン状態フラグ

final bool isRunning();
スレッドが実行中かどうかを調べます。

Returns:
スレッドが実行中ならば true、そうでなければ false

const int PRIORITY_MIN;
スレッドに設定できる最低の優先度です。 複数のスケジューリングポリシーが設定できるシステムでは、 この値はプロセスのスケジューリングポリシーの下で 有効な最低の優先度になります。

const int PRIORITY_MAX;
スレッドに設定できる最高の優先度です。 複数のスケジューリングポリシーが設定できるシステムでは、 この値はプロセスのスケジューリングポリシーの下で 有効な最高の優先度になります。

final int priority();
スレッドのスケジューリング優先度を取得します。

Returns:
このスレッドの優先度

final void priority(int val);
スレッドのスケジューリング優先度を設定します。

Params:
int val このスレッドの新しい優先度

static void sleep(Duration val);
呼び出したスレッドを、指定された時間の間停止します。 OSのサポートする最大の sleep 時間より長い値を指定した場合、複数回のシステムコール呼び出しとなります。

Parameters:
Duration val スレッドを停止したい時間の下限

In:
非負の値を指定すること。

Example:
 Thread.sleep( milliseconds( 50 ) );  // 50ミリ秒sleep
 Thread.sleep( seconds( 5 ) );        // 5秒sleep

static void sleep(long period);
呼び出したスレッドを、指定された時間 period の間停止します。 OSのサポートする最大の sleep 時間より長い値を指定した場合、複数回のシステムコール呼び出しとなります。

Params:
long period スレッドを停止したい時間の下限を、 100ナノ秒単位で指定

In:
period は非負の値を指定すること。

Example:
 Thread.sleep( 500_000 );        // 50ミリ秒sleep
 Thread.sleep( 50_000_000 ); // 5秒sleep



static void yield();
呼び出したスレッドから強制的にコンテキストスイッチします。

static Thread getThis();
呼び出したスレッドへの参照を取得します。

Returns:
呼び出しスレッドを表すスレッドオブジェクト。 この返値をdeleteした場合の挙動は未定義です。

static Thread[] getAll();
現在システムの把握している全スレッドのリストを返します。

Returns:
現在システムの把握している全スレッドへの参照を持った配列を返します。 この配列の要素を delete した場合の挙動は未定義です。

static int opApply(scope int delegate(ref Thread) dg);
現在システムの把握している全スレッドのリストを返します。 Thread オブジェクトを した場合の挙動は未定義です。

Params:
int delegate(ref Thread) dg delegateとして渡されるコード

Returns:
全ての要素をvisitした場合0、それ以外の場合非0。

deprecated alias findThread;

void thread_init();
スレッドモジュールを初期化します。 この関数はガベージコレクタの起動時に、 他のスレッドルーチンが呼び出される前に実行されなければいけません。

bool thread_isMainThread();

Thread thread_attachThis();
Thread thread_attachByAddr(Thread.ThreadAddr addr);
Thread thread_attachByAddrB(Thread.ThreadAddr addr, void* bstack);
この関数を呼び出したスレッドをDランタイムでの使用のために登録します。 すでに登録済みのスレッドでこの関数が呼ばれた場合の動作は未定義です。

deprecated nothrow void thread_setNeedLock(bool need);
これは thread_attach で自動的に処理されます

deprecated alias thread_attach;
deprecated alias thread_detach;
他の extern (C) ルーチンとの一貫性のために改名されました

void thread_detachThis();
void thread_detachByAddr(Thread.ThreadAddr addr);
この関数を呼び出したスレッドをDランタイムの管理下から外します。 すでに登録解除されたスレッドでこの関数が呼ばれた場合の動作は未定義です。

static Thread thread_findByAddr(Thread.ThreadAddr addr);
指定されたIDを持つスレッドを、全てのスレッドリストから検索します。

Parameters:
Thread.ThreadAddr addr 検索したいスレッドID

Returns:
スレッド識別子に関連付いたスレッドオブジェクト。見つからなければ null

void thread_joinAll();
現在実行中の全ての非デーモンスレッドの終了を待機します。 この機能は、繰り返しスレッドリストをスキャンして デーモンスレッドのみが残るまで待つことで実現されています。

nothrow bool thread_needLock();
プロセスがマルチスレッドかどうかを判定するのに使用する関数です。 対象コードがスレッドを開始するおそれがないことを保証できる場合に限り、 この値に基づいて コードの最適化をすることも可能です。

Returns:
Thread.start() がこのプロセスで呼ばれていた場合 true

void thread_suspendAll();
呼び出しスレッドを除く全てのスレッドを、"stop the world" GCの実行のために停止します。この関数は複数回呼び出すこともできますが、その場合、 対応する回数分 thread_resumeAll を呼び出す必要があります。

Throws:
実行中スレッドを suspend できなかった場合 ThreadException

void thread_resumeAll();
呼び出しスレッドを除く全てのスレッドを "stop the world" GCの実行後に再開します。この関数は、対応する thread_suspendAll の呼び出し一回につき一回ずつ呼び出す必要があります。

In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。

Throws:
スレッドを resume できなかった場合 ThreadException

void thread_scanAll(scanAllThreadsFn scan, void* curStackTop = null);
ガベージコレクタのエントリポイントです。指定されたdelegeteには スタックとレジスタ値の両方を表す範囲が渡されます。

Params:
scanAllThreadsFn scan スキャナ関数。p1 から p2 - 1 までをスキャンするための関数です
void* curStackTop 呼び出しスレッドのスタックトップを指す (optional な) ポインタ

In:
このルーチンは thread_suspendAll の呼び出しの後にのみ使用できます。

void thread_processGCMarks();
このルーチンは、スレッド別のGC処理をランタイムに行わせます。 これは、スキャンされていないポインタから参照されているが解放されそうな領域の処理に必要です。 現在のところ、 これはすなわち、配列追記用のキャッシュを意味します。

In:
全てのスレッドをresumeする直前にこのルーチンを呼ぶ必要があります。

class ThreadGroup;
いくつかのプログラミングテクニックを簡単化するためのクラスです。

final Thread create(void function() fn);
fn を実行するスレッドを作ってスタートし、 グループに追加します。

Params:
void function() fn スレッド関数

Returns:
新しく作られたスレッドへの参照

final Thread create(void delegate() dg);
dg を実行するスレッドを作ってスタートし、 グループに追加します。

Params:
void delegate() dg スレッド関数

Returns:
新しく作られたスレッドへの参照

final void add(Thread t);
t を、すでにグループに追加済みでなければ、追加します。

Params:
Thread t 追加したいスレッド

In:
tnull は指定できません

final void remove(Thread t);
t をグループから削除します。 t がグループに入っていなかった場合は何も起きません。

Params:
Thread t 削除したいスレッド

In:
tnull は指定できません

final int opApply(scope int delegate(ref Thread) dg);
グループ内の全てのスレッドに関する操作

final void joinAll(bool rethrow = true);
すべてのスレッドをjoinします。 この関数は完了まで add, remove, opApply をブロックします。

Params:
bool rethrow 未処理の例外が発生した場合に、 再throwするかどうかを決めるフラグ

Throws:
join対象のスレッドで処理されなかった例外

class Fiber;
このクラスは、スレッド及びガベージコレクタの機能と統合された、 協調型並行性を提供します。ファイバの呼び出しは、 呼び出したファイバが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:
fnnull は指定できません。

this(void delegate() dg, size_t sz = PAGESIZE);
動的なDの関数に関連づけて ファイバオブジェクトを初期化します。

Params:
void delegate() dg ファイバで実行する関数
size_t sz ファイバのスタックサイズ

In:
dgnull は指定できません。

final Object call(bool rethrow = true);
このファイバオブジェクトに実行を移します。 呼び出した側のコンテキストは、Fiber.yield() が呼ばれるか、 未処理例外でcallされたファイバが終了するまで、一時停止します。

Params:
bool rethrow 未処理例外があった場合再 throw するかどうかを指定

In:
HOLD 状態のファイバのみを call できます。

Throws:
対象Fiberで処理されなかった例外

Returns:
rethrow = false の場合、(もしあれば)未処理例外オブジェクト。 それ以外の場合は null を返します。

final void reset();
再利用できるように、このファイバをリセットします。 すでに終了したファイバに対してのみ使用できます。 それ以外のファイバに対して使うと、scope依存の機能が実行されなくなります。Stack-based たとえば、終了していないファイバをresetすると、 スタックベースのクラスが正しく解放されません。

In:
TERM 状態のファイバのみを reset できます。

enum State;
ファイバは HOLD, EXEC, TERM のいずれかの状態を持ちます。HOLDは、 一度実行がスタートした後一時停止している状態です。 EXECは、現在実行中という状態です。 TERMは、ファイバの実行が終了した状態です。 ファイバの終了後再利用するには、resetを呼び出す必要があります。

HOLD


EXEC


TERM


final const State state();
ファイバの現在の状態を返します。

Returns:
enum値で現在の状態を返します

static void yield();
強制的にコンテキストスイッチを起こし、呼び出し元のファイバに制御を戻します。

static void yieldAndThrow(Throwable t);
強制的にコンテキストスイッチを起こし、 戻った先のファイバで例外tをthrowします。

Params:
Throwable obj throw したいオブジェクト

In:
tnull は指定できません。

static Fiber getThis();
呼び出したファイバを表す参照を返します。アクティブなファイバが存在しない場合は、 null となります。

Returns:
呼び出したファイバを表す参照を返します。アクティブなファイバが存在しない場合は、 null となります。この返値をdeleteしたときの挙動は未定義です。