2 つのライブラリ (A と B) があり、それぞれにソケットをリッスンする関数が 1 つあるとします。これらの関数は select() を使用し、データが到着した場合はすぐに何らかのイベントを返します。それ以外の場合は、しばらく ( timeout ) 待ってから NULL を返します。
A_event_t* A_wait_for_event(int timeout);
B_event_t* B_wait_for_event(int timeout);
今、私は自分のプログラムでそれらを使用しています:
int main (int argc, char *argv[]) {
// Init A
// Init B
// .. do some other initialization
A_event_t *evA;
B_event_t *evB;
for(;;) {
evA = A_wait_for_event(50);
evB = B_wait_for_event(50);
// do some work based on events
}
}
各ライブラリには独自のソケット (udp ソケットなど) があり、外部からアクセスすることはできません。
問題: これはあまり効率的ではありません。たとえば、*B_wait_for_event* によって配信されるのを待っているイベントがたくさんある場合、これらは *A_wait_for_event* タイムアウトまで常に待機する必要があり、ライブラリ B と私のプログラムのスループットが効果的に制限されます。
通常、スレッドを使用して処理を分離できますが、イベントの処理で他のライブラリの関数を呼び出す必要がある場合や、その逆の場合はどうでしょう。例:
if (evA != 0 && evA == A_EVENT_1) {
B_do_something();
}
if (evB != 0 && evB == B_EVENT_C) {
A_do_something();
}
したがって、2 つのスレッドを作成してライブラリから機能を分離できたとしても、これらのスレッドはそれらの間で (おそらくパイプを介して) イベントを交換する必要があります。1 つのスレッドが *X_wait_for_event()* 関数によってブロックされ、他のスレッドからすぐにデータを受信できないため、これでもパフォーマンスが制限されます。
これを解決するには?