4

私のプログラムには、メインスレッドから作成された2つのスレッドがあります。各スレッドは、接続された個別の外部通信デバイスで動作します。

                main thread
    thread_1                        thread_2

Thread_1 は、外部デバイスからデータ パケットを受信します。各データ パケットは、それぞれ 20 バイトの構造体です。

ここで、thread_2 が thread_1 によって受信されたデータを読み取り、それを接続されているデバイスに転送する必要があります。

2 つのスレッド間でデータを転送するにはどうすればよいですか。

この場合に使用する Linux 変数タイプの正確な名前は?

4

1 に答える 1

8

あなたの問題は、生産者/消費者問題の典型的な例です。

コンテキストに応じて、これを実装するためのいくつかの可能な方法があります-あなたの投稿はpthreads、との両方でタグ付けされていますlinux-device-drivers。これはカーネルスペース、ユーザースペース、またはカーネルスペース->ユーザースペースですか?

カーネルスペース

解決策には、リングバッファ(スレッド間の複数のメッセージが同時に送信される可能性があると予想される場合)とセマフォが含まれる可能性があります。

Linuxデバイスドライバー第3版の第5章は、開始するのに適した場所です。

ユーザースペース

両方のスレッドがユーザースペースにある場合、同じプロセスの生産者/消費者パターンは通常、pthread 条件変数を使用して実装されます。それを行う方法の実例はここにあります

カーネルスペース->ユーザースペース

Linuxで使用される一般的なアプローチは、ユーザースペーススレッドthread_2がカーネルスペースによって通知されたファイリングシステムオブジェクトをブロックすることthread_1です。通常、問題のファイリングシステムオブジェクトは/devまたはにあり/sysます。LDD3には、両方のアプローチの例があります。

于 2012-12-03T09:23:09.120 に答える