2013-12-06 6 views
0

Я пытаюсь получить простой HTTP-сервер с libevent и смог сделать это на основе примеров документации. Однако, без нитей, вся цель libevent - это мусор. Я не очень разбираюсь в потоках в C++ 11, но мне было бы интересно узнать, как правильно реализовать такой сервер.Многопоточный HTTP-сервер с libevent

Я нашел этот пример онлайн: https://gist.github.com/kzk/665437

Правильно ли это? Является ли pthreads правильным выбором? Кроме того, эта линия очень странная:

for (int i = 0; i < nthreads; i++) { 
    pthread_join(ths[i], NULL); 
} 

Что там происходит?

+0

Вы должны прочитать о стратегиях обращения с несколькими клиентами. Один поток на клиента может быть субоптимальным. http://www.kegel.com/c10k.html#strategies –

+0

Также, если вы хотите использовать потоки, и вы используете C++ 11, вы можете посмотреть здесь: http://en.cppreference.com/w/CPP/резьба/резьба. –

+0

_ «Что там происходит?» _ - Эти 3 линии присоединяются к нитям, не заботясь о их коде выхода. Другими словами, основной процесс сервера ждет, пока все они не закончатся. – Damon

ответ

1

Я не могу рекомендовать libevhtp все же, из-за serious bug, но вы можете захотеть взглянуть на то, как они используют темы: https://github.com/ellzey/libevhtp/blob/master/examples/thread_design.c
- Создают отдельные экземпляры Libevent, по одному для каждого потока. Все асинхронный код будет работать без дополнительных блокировок и т. Д., Если вы будете осторожны, чтобы использовать одну и ту же базу libevent в потоке. ИМО - это лучший подход к оформлению libevent для типичного веб-сервера.

Что касается https://gist.github.com/kzk/665437, C++ 11 нити не должны быть хуже, чем pthreads.

+0

В чем разница между потоками C++ 11 и pthreads? – vinnylinux

+0

Это разные стандарты на разных языках. – ArtemGr

+0

Я вижу. Несмотря на то, что у этого есть эта серьезная ошибка, кажется хорошей базой для начала работы! – vinnylinux