Стандартный способ выбора:
fd_set readset;
FD_ZERO(&readset);
FD_SET(mysocket, &readset);
fd_set writeset;
FD_ZERO(&writeset);
FD_SET(mysocket, &writeset);
time_val tv = {0, 100};
int res = select(mysocket+1, &readset, &writeset, NULL, &tv);
....
Я заметил некоторую блокировку с помощью FD_ZERO/FD_SET
dance, поэтому вот моя попытка оптимизировать.
Я бы получил глобальная чистка fd_set
, например, gMyCleanSet
сбоку. Когда мой сокет впервые создается и вызывается bind / connect, я бы сделал следующее:
FD_ZERO(&gMyCleanSet);
FD_SET(mysocket, &gMyCleanSet);
, затем всякий раз, когда на сокете должен использоваться select()
, я делаю:
fd_set readset = gMyCleanSet;
fd_set writeset = gMyCleanSet;
time_val tv = {0, 100};
int res = select(mysocket+1, &readset, &writeset, NULL, &tv);
Вопрос
Пока я не заметил ничего плохого в моих ограниченных тестах. Интересно, правильная ли это оптимизация. Будут ли побочные эффекты?