Как перенести задачи в потоки в пуле потоков, как это сделал Nginx? - PullRequest
0 голосов
/ 22 апреля 2020

Я реализую небольшой веб-сервер, используя epoll с неблокирующим вводом / выводом (для сокета установлен неблокирующий) и пул потоков. Я бы хотел, чтобы он имел ту же структуру, что и Nginx. Таким образом, базовое c событие l oop будет выглядеть так:

while (1) {
    ...
    int n = epoll_wait();
    for (i = 0; i < n; ++i) {
        events = events[i].events;
        req = events[i].data.ptr;
        ...
        rev = req->read;
        if (events & EPOLLIN) {
            rev->handler();
        }

        wev = req->write;
        if (events & EPOLLOUT) {
            wev->handler();
        }
    }
}

Функция-обработчик событий чтения и записи в основном включает в себя read от клиента, анализирует входящий запрос и sendfile et c.

Что касается введения пула потоков, я прочитал этот пост из Nginx и там сказано, что они переносят задачи, такие как read и sendfile, в потоки, чтобы справиться с ними, но я понятия не имею, как этого добиться. Откуда мне передавать задачу потокам?

Может кто-нибудь показать мне пример или даже лучше всего проект (не слишком большой) , если вы уже делали то же самое раньше? Пожалуйста, помогите мне!

...