假设我有两个库(A 和 B),每个库都有一个侦听套接字的函数。这些函数使用 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();
}
因此,即使我可以创建两个线程并从库中分离功能,这些线程也必须在它们之间交换事件(可能通过管道)。这仍然会限制性能,因为一个线程会被 *X_wait_for_event()* 函数阻塞,并且不可能立即从其他线程接收数据。
如何解决这个问题?