我正在尝试创建一个高效的多线程事件多路复用器(在linux上使用epoll,在windows上使用iocp)
对于我添加到epoll的每个事件源,我需要存储一些其他信息。
起初,我已经使用了一个动态增长的阵列(因为缓存一致性),但事实证明,这不是一个好的解决方案,因为我需要保持锁定的保护互斥锁长。
// this function is OK, performance wise
void Multiplexer::add(int fd) {
mutex.lock();
<add fd int my array>
mutex.unlock();
<add fd into epoll, setting epoll_data.u32 to fd's index in the array>
}
void Multiplexer::poll() {
events = <call_epoll>
mutex.lock(); // here, I need to keep mutex locked for a long time, as array can grow from a different thread which calls add
for (events) { // or, the other solution could be that I lock/unlock mutex each time in the for loop, which is bad for performance
<handle_event_using_array>
}
mutex.unlock();
}
我的第二个想法是使用list,但这样我可能会失去缓存一致性的良好属性(它可能不那么重要,所以我可能会这样做)。
这个问题有更好的数据结构吗?或者更好的想法如何解决这个问题?