Эффективный способ инициализации набора дескрипторов файла, например, fd_set, для использования select () - PullRequest
0 голосов
/ 17 июня 2020

Стандартный способ выбора:

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

Вопрос

Пока я не заметил ничего плохого в моих ограниченных тестах. Интересно, правильная ли это оптимизация. Будут ли побочные эффекты?

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