在poll上添加/删除描述符的优雅方法

时间:2012-11-06 09:53:16

标签: c++ c unix polling

我必须在一个poll中处理大约1000个描述符(我不能使用epoll,因为它是特定于Linux的)并且我必须能够动态地添加/删除它们(处理新连接和删除已关闭)。

这意味着我应该在每次迭代时重新组合描述符数组。

从技术角度来看,这是显而易见的,但有人知道这样做的一种美妙方式吗?

1 个答案:

答案 0 :(得分:4)

我会将死亡描述符保留在数组中,并偶尔清除一次。 我还会保留每个描述符的位置,以便于删除,但这可以进一步优化。 诀窍是在数组中保留无效的描述符,而不是每次都重新排列数组。

例如:

struct pollfd pfds[MY_MAX_FDS];
int nfds = 0;
enum { INVALID_FD = -1 };
....

typedef std::map<int,int> desc_to_index_t;
desc_to_index_t d2i;
....
// add descriptor
if (nfds == MY_MAX_FDS){
    // purge old fds
    // go through pfds and remove everything that has invalid fd
    // pfds should point to a condensed array of valid objects and nfds should be updated as well, as long as d2i.
}
pfds[nfds] = { desc, events, revents};
d2i.insert(std::make_pair(desc,nfds));
++nfds;
....
// remove descriptor
desc_to_index_t::iterator it = d2i.find(desc);
assert(it != d2i.end());
pfds[it->second] = { INVALID_FD, 0, 0 };
d2i.erase(it);

这样,只需要在超过某个阈值时清除,并且不需要每次都构建数组。