1

私はユーザーレベルのスレッドライブラリの作成に取り組んでおり、スタブ内で関数を実行したいので、関数ポインターをスタブ関数に渡したいと思います。

ここに私のスタブ関数があります:

void _ut_function_stub(void (*f)(void), int id)
{
    (*f)();
    DeleteThread(id);
}

これは、ユーザーが呼び出すものです。私がやりたいのは、_ut_function_stub のポインターを取得してpcに割り当てることです。キャストを含むさまざまなオプションを試しましたが、コンパイラーは「void 式の無効な使用」と言い続けます。

int CreateThread (void (*f) (void), int weight)
{
    ... more code

    pc = (address_t)(_ut_function_stub(f, tcb->id));

    ... more code
}

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

独自のユーザー レベル スレッド ライブラリの実装に興味がある場合は、(現在は非推奨になっている)ucontext実装を調べることをお勧めします。具体的には、で使用されている構造体の定義をucontext.h見ると、スレッド状態の有効なスナップショットを取得するために実際にキャプチャする必要があるすべてのものを確認するのに役立ちます。

(address_t)あなたの例で誤ったキャストで実際にキャプチャしようとしているのは、現在の継続です。残念ながら、C はファーストクラスの継続をサポートしていないため、スタックのスワップやレジスターのダンプなど、より低レベルの処理を行うことに行き詰まります (そのためucontext、参照として指摘したのは親切なことです)。本当にこれを正しくしたい場合は複雑です)。

于 2013-10-20T15:39:11.010 に答える