Я работаю над проектом клиент-сервер. Он должен иметь возможность обрабатывать несколько (> 1000) клиентских подключений.
Основной каркас моего цикла ожидания на стороне сервера выглядит следующим образом:
while(server->running)
{
// If I remove this, my CPU use will be very intensive
// but putting 10 milliseconds sleep will cause a significant delay
// What's is the best practice?
boost::this_thread::sleep(boost::posix_time::milliseconds(10));
if (server->connectionQueue.empty())
continue;
Connection* conn = server->connectionQueue.front();
server->connectionQueue.pop();
Stream* stream = conn->HandleData();
// More steps if needed here
server->connectionQueue.push(conn);
}
Мои вопросы:
В настоящее время я использую один цикл ожидания для всех соединений. Это правильно? или какова лучшая практика? Должен ли я использовать цикл ожидания для каждого соединения?
Если я удалю thread::sleep
, загрузка моего процессора будет очень интенсивной. Но перерыв в 10 миллисекунд приведет к значительной задержке, особенно, если есть несколько соединений. Так что же такое лучшая практика?
Я гуглил и нашел что-то под названием FD_ISSET
: http://linux.die.net/man/3/fd_isset
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
#define _XOPEN_SOURCE 600
#include <sys/select.h>
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
Но я не знаю, как использовать? Как я могу использовать его для моего дескриптора файла сокета?
Не уверен, что я ясно дал понять.