現在、すべて開いている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スレッドを効率的にブロックする方法を考えることはできません。