1

同じプロセス内のスレッド間の通信に使用される、プログラム内に多数の FIFO キューを作成する必要があります。

この目的のために pipe() を使用できると思います。このようにして、キューからノードをフェッチするスレッドで select または poll を使用できるからです。

        int* fd_pipe = (int*)malloc(2*sizeof(int));
        pipe(fd_pipe);

問題は、各ノードが構造体であるため、ポインターをキューに入れる方法です。ポインターをキューに入れたいのですが、次のようなものです。

typedef{ struct パケット *pkt; 構造体情報 *info; int シーケンス; }ノード;

  on threads which put node into the queue:

   Node* node = (Node*)malloc(sizeof(Node));
   Node->info = ...;
   Node->seq = ...;
   Node->pkt = ...;
   write(fd_pipe[1], node, sizeof(node));

  on threads which read node from the queue:

   char buf[1000];
   read(fd_pipe[0], buf, sizeof(node))
   Node* mynode = (Node*)buf;

次に、mynode が必要です。

私のプログラムに何か問題がありますか?特に厳密なエイリアシングまたは駄洒落タイプの問題? ありがとう!

4

1 に答える 1

2

エイリアシングの問題はありません。ここで私が目にする唯一の問題はread(fd_pipe[0], buf, sizeof(node))、これはread(fd_pipe[0], buf, sizeof(Node *)).

ここで char バッファを使用する理由がわかりません。

Node *node;
if (read(fd_pipe[0], &node, sizeof(node)) <= 0) {
    // error, deal with it
}

よりシンプルで明確です。

これで、デフォルトであるブロッキング i/o を使用する場合にのみ、コードがそのまま機能します。また、技術的には、短い読み取り/書き込みを処理する必要がありますが、読み取り/書き込みサイズが PIPE_BUF (常にポインターよりもはるかに大きい) より小さい場合、パイプでの書き込み/読み取りはアトミックです。

書き込み前のメモリ同期について、コードに少し灰色の領域がありますが、これはシステム コールであるため、機能します。

パイプは、スレッド間で通信する珍しい方法です。通常、人々はインメモリ キューを使用してスレッド間の通信を行います。一例はhttp://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.htmlです

于 2013-05-19T17:00:48.190 に答える