Элегантный способ добавить / удалить дескрипторы в / из опроса

Я должен обработать около 1000 дескрипторов в одном poll (Я не могу использовать epoll поскольку это специфично для Linux), и я должен иметь возможность динамически добавлять / удалять их (обрабатывать новые соединения и удалять закрытые).

Это означает, что я должен рекомбинировать массив дескрипторов на каждой итерации.

Это довольно очевидно с технической точки зрения, но кто-нибудь знает красивый способ сделать это?

5

Решение

Я бы держал мертвые дескрипторы в массиве и время от времени очищал.
Я бы также сохранил расположение каждого дескриптора для легкого удаления, но это можно оптимизировать и дальше.
Хитрость заключается в том, чтобы хранить недопустимые дескрипторы в массиве, а не переупорядочивать массив каждый раз.

Например:

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);

Таким образом, вам нужно будет произвести очистку только после того, как будет преодолен определенный порог, и вам не нужно каждый раз собирать массив.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]