1

現在、すべて開いているudp/tcp接続であるN個のスレッドがあります。いずれかのスレッドから最初のパケットを受信すると、メインスレッド(Nスレッドと呼ばれる)はNスレッドでの実行を一時停止し、Nスレッドを再開する前にいくつかの作業を行う必要があります。

私の最初のアイデアは、N個のスレッドすべてに、メインスレッドからのpthread_cond_broadcastを待機する共通のミューテックスを使用させることでした。私が理解しているように、N個のスレッドはすべて同じミューテックスに依存しているため、ブロードキャストが呼び出されたときにスケジューラーによって決定された順序で実行を再開します。ただし、並行して再開する必要があります。

これは基本的に私の問題がどのように見えるかです:

メインスレッド:

//create N threads. Each thread is connected to a different 
//location but uses the same code

//detect that one of the threads has received a packet
//tell all child threads to pause
pauseThreads();

//do some work on the first packet

resumeThreads();

//tell all child threads to resume

子スレッドコード:

while(true){
  recv() data


  //the other N-1 threads should ideally block here, 
  //since I'd like to process just the 
  //very first packet

  //hopefully pauseThreads() has been called by the main
  //thread by here if the first packet has been received.
  //All threads should block here until the main thread 
  //is done processing the first packet. Once it's done
  //processing, *firstPacket will be false and the if statement 
  //can be skipped over

  //only one thread should ever access this
  if(*firstPacket  /*this is a global variable*/  ){
      //process first packet
      *firstPacket = false;
      //the thread that receives the first packet should block here
  }

  //process same packet data in another format
}

スレッドを同時に再起動する必要がある理由は、速度が問題であり、各スレッドが1つずつ独自のデータ処理を完了するのを待つことができないためです。ifステートメント内のブロックを把握していますが、N-1スレッドを効率的にブロックする方法を考えることはできません。

4

1 に答える 1

0

一番

サーバーにタイムスタンプまたはシーケンス番号を udp パケットに追加してもらいます。

あるいは

レシーバーには、ネットワーク アダプターが 1 つだけあり、サーバーとユーザーの間のルートが 1 つしかないと仮定します。そうしないと、パケットが並べ替えられる可能性があります。

そのため、さらに処理を行う前に、パケットにタイム/シーケンス スタンプを付ける必要があります。これには 1 つのスレッドを使用し、残りのタスクをワーカー スレッドにファーム アウトします。

于 2012-06-29T08:28:14.130 に答える