英語版
このページの英語版を見る

core.thread.fiber

ファイバーモジュールは、OSに依存しない軽量糸、別名ファイバーを提供する。
License:
Distributed under the Boost Software License 1.0. (See accompanying file LICENSE)
Authors:
Sean Kelly, Walter Bright, Alex Rønne Petersen, Martin Nowak
class Fiber;
このクラスは、スレッド機能とガベージコレクション機能を統合した、協調的な同時実行メカニズムを提供する。 このクラスは、スレッド機能とガベージコレクション機能と統合された協調並行性メカニズムを提供する。 ファイバーを呼び出すことは ファイバーを呼び出すことは、ファイバーが降伏したときに(Fiber.yield()によって)戻るブロッキング操作と見なされる。 Fiber.yield())によって)返される。 実行は呼び出し元のスレッドのコンテキスト内で行われる。 そのため、同じスレッドが毎回ファイバーを呼び出す限り、メモリの可視性を保証するために同期を取る必要はない。 同じスレッドが毎回ファイバーを呼び出す限り、メモリの可視性を保証するための同期は必要ない。 ファイバーが1つのスレッドにバインドされている必要はない。 ファイバーを特定のスレッドにバインドする必要はない。 むしろ、ファイバー を実行中でない限り、スレッド間で自由に渡すことができる。 実行中でない限り、スレッド間で自由に受け渡すことができる。 スレッドと同様に、新しいファイバースレッドは、次の例のように、派生または合成のいずれかを使用して作成することができる。 次の例のように、派生または合成のいずれかを使用して新しいファイバースレッドを作成することができる。

警告 現在の実装では、ステータス・レジスタは保存されない。これは次のことを意味する。 浮動小数点例外ステータス・ビット(オーバーフロー、0 による除算)、丸めモード などは、ファイバーごとではなくスレッドごとに設定される!

警告 ARMでは、druntimeがARM_SoftFloatとしてコンパイルされた場合、FPUレジスタは保存されない。 このようなビルドが、実際にFPUを持つARM_SoftFPシステムで使用された場合、以下のような問題が発生する。 があり、他のライブラリがFPUレジスタを使用している(他のコードがARM_SoftFPとしてコンパイルされている)。 他のコードがARM_SoftFPとしてコンパイルされている)場合、問題が発生する可能性がある。この場合、Druntimeは としてコンパイルしなければならない。

Authors:
Based on a design by Mikola Lysenko.
Examples:
int counter;

class DerivedFiber : Fiber
{
    this()
    {
        super( &run );
    }

private :
    void run()
    {
        counter += 2;
    }
}

void fiberFunc()
{
    counter += 4;
    Fiber.yield();
    counter += 8;
}

// 各型のインスタンスを作成する
Fiber derived = new DerivedFiber();
Fiber composed = new Fiber( &fiberFunc );

assert( counter == 0 );

derived.call();
assert( counter == 2, "Derived fiber increment." );

composed.call();
assert( counter == 6, "First composed fiber increment." );

counter += 16;
assert( counter == 22, "Calling context increment." );

composed.call();
assert( counter == 30, "Second composed fiber increment." );

// それぞれのファイバーは完了まで走っているので、それぞれのファイバーの状態はTERMであるべきだ
assert( derived.state == Fiber.State.TERM );
assert( composed.state == Fiber.State.TERM );
enum int defaultStackPages;
nothrow this(void function() fn, size_t sz = pageSize * defaultStackPages, size_t guardPageSize = pageSize);
静的な D関数に関連付けられたファイバーオブジェクトを初期化する。
Parameters:
void function() fn ファイバー関数。
size_t sz このファイバーのスタック・サイズ。
size_t guardPageSize このファイバーのスタックサイズ。 オーバーフローをトラップするこれを使うと を使用するプラットフォームでは、mmapされた領域の数が増えるので注意すること。 を使用しているプラットフォームでは、これを使用すると mmaped 領域の数が増えるので、OS が課す制限にぶつかる可能性があることに注意すること。

この場合 fnはNULLであってはならない。

nothrow this(void delegate() dg, size_t sz = pageSize * defaultStackPages, size_t guardPageSize = pageSize);
ファイバー・オブジェクトを初期化する。 D関数に関連付けられたファイバー・オブジェクトを初期化する。
Parameters:
void delegate() dg ファイバー関数。
size_t sz このファイバーのスタック・サイズ。
size_t guardPageSize このファイバーのスタックサイズ。 オーバーフローをトラップするこれを使うと を使用するプラットフォームでは、mmapされた領域の数が増えるので注意すること。 を使用しているプラットフォームでは、これを使用すると mmaped 領域の数が増えるので、OS が課す制限にぶつかる可能性があることに注意すること。

また dgはNULLであってはならない。

final Throwable call(Rethrow rethrow = Rethrow.yes);

final Throwable call(Rethrow rethrow)();
実行をこのファイバー・オブジェクトに移す。 呼び出し元のコンテキストは ファイバーが Fiber.yield() を呼び出すか、未処理の例外によって終了するまで、呼び出しコンテキストは中断される。 処理されない例外によって終了するまで中断される。
Parameters:
Rethrow rethrow この をスローする。

このファイバーは このファイバーはHOLD状態でなければならない。

Throws:
結合スレッドによって処理されない例外。
Returns:
rethrow=falseの場合はこのファイバーによって処理されない例外、それ以外の場合はNULLである。 でなければ
enum Rethrow: bool;
の rethrow 動作を制御するフラグ。 call
final nothrow @nogc void reset();

final nothrow @nogc void reset(void function() fn);

final nothrow @nogc void reset(void delegate() dg);
このファイバーをリセットして、再利用できるようにする。 新しい関数/デリゲートで再利用できるように、このファイバーをリセットする。 このルーチンは このルーチンは、終了したファイバーに対してのみ呼び出されるべきである。 スコープに依存する関数が実行されなくなる可能性があるからだ。 そうしないと、スコープに依存した機能が実行されなくなる可能性があるからだ。 終了する前にファイバーがリセットされると、適切にクリーンアップされない可能性がある。

このファイバーは このファイバーの状態は、TERM または HOLD でなければならない。

enum State: int;
ファイバーは、3 つの状態のうちの 1 つを占めることができる:HOLD、EXEC、および TERM。
HOLD
HOLD 状態は、中断され、呼び出す準備ができているファイバーに適用される。 に適用される。
EXEC
EXEC 状態は、現在実行中のファイバーに設定される。 に設定される。
TERM
TERM 状態は、ファイバーが終了するときに設定される。ファイバーが終了すると ファイバーが終了すると、再度呼び出す前にリセットする必要がある。
final const pure nothrow @nogc @property @safe State state();
このファイバーの現在の状態を取得する。
Returns:
このファイバーの状態を列挙値として取得する。
static nothrow @nogc void yield();
呼び出しているファイバーから強制的にコンテキスト・スイッチを切り離す。
static nothrow @nogc void yieldAndThrow(Throwable t);
呼び出しているファイバーから離れるようにコンテキスト・スイッチを強制的に発生させ、その後に 呼び出しているファイバーの obj をスローする。
Parameters:
Throwable t スローするオブジェクト。

投げられるオブジェクト。 tはNULLであってはならない。

static nothrow @nogc @safe Fiber getThis();
呼び出しているファイバーへの参照を提供する。 への参照を提供する。
Returns:
このスレッド内で現在アクティブなファイバーがない場合はNULLとなる。 への参照を提供する。このオブジェクトを削除した結果は未定義である。