1

私は Linux カーネル モジュールを持っています。トラフィックを送信するために、TCP サーバーと複数のクライアントを実装する必要がありました。質問がありました、

サーバー側には、受け入れられるのを待っているTCP接続を確認すると、別のkthreadを生成するmain-kthreadがあります。メインの kthread がいくつかの kthread を生成した後、main-kthread が終了する前に他の kthreads が確実に終了するように、main-kthread を待機状態にする方法を教えてください。

phtread-join セマンティクスに似たものを探していますが、Linux カーネル空間でこれが必要です。

kthread_join 自体が見つかりませんでした。代替手段を探しています。私はウェイトキューについて読みました。したがって、interruptible_sleep_on() と wake_up() を見ていました。しかし、これらの API の使用方法がわかりません。
たとえば
、メイン スレッドで、interruptible_sleep_on を実行すると、誰が彼を起こす必要がありますか? 他のすべてのスレッド、または最後のスレッド? 最後に終了したスレッドを特定するにはどうすればよいですか? また、この main-kthread が起動されたときに他のスレッドが終了していることを確認する方法。

4

1 に答える 1

2

待機キューは適切なツールです。Linux Device Drivers (LDD) Chapter 6に適切な説明があります。コードがどのように見えるかのスケッチを次に示します。

  • サーバー スレッドのカウンターを維持します。
  • サーバー スレッドを生成する直前にカウンターをインクリメントします。
  • サーバー スレッドが存在する場合は、カウンターを減らします。
  • メインスレッドでは、終了時にカウンター値が 0 になるまで待機キューで待機します。
  • サーバー スレッドでは、カウンターを減らした直後に、待機キューでシグナルを送信してメイン スレッドに通知します。

警告: テストされていないコードです。これは単なるスケルトンです。

struct global_data {
    wait_queue_head_t wq;
    atomic_t thread_count;
};

main_thread () {
    global_data gd = {0};
    init_wait_queue_head(&gd.wq);
    while (serving) {
        …
        atomic_inc(&server_threads);
        if (IS_ERR_OR_NULL(kthread_create(server_thread, &gd)) {
            atomic_dec(&server_threads);
        }
    }
    wait_event_interruptible(&gd.wq, atomic_read(gd.thread_count) == 0);
    /* final cleanup */
}

server_thread (global_data *gd) {
    …
    atomic_dec(&gd->server_threads);
    wake_up(&gd->wq);
}
于 2012-08-24T22:40:51.110 に答える