Библиотека сайта rus-linux.net
Назад | Сервер TCP/IP ... много серверов хороших и разных | Вперед |
Параллельный сервер, создающий потоки по запросам
Строим параллельный сервер (файл ech2.cc), но вместо параллельных клонов процессов теперь будем порождать параллельные потоки в том же адресном пространстве:
#include <pthread.h> #include "common.h" void* echo( void* ps ) { int sc = *(int*)ps; sched_yield(); retrans( sc ); close( sc ); if( debug ) cout < "*" < flush; return NULL; } // ретранслятор c pthread_create по запросу int main( int argc, char *argv[] ) { int ls = getsocket( THREAD_PORT ), rs; setv( argc, argv ); while( true ) { pthread_t tid; if( ( rs = accept( ls, NULL, NULL ) ) < 0 ) errx( "accept error" ); if( pthread_create( &tid, NULL, &echo, &rs ) != EOK ) errx( "thread create error" ); sched_yield(); }; exit( EXIT_SUCCESS ); };
Здесь всё очень напоминает предыдущие решения, минимальных комментариев заслуживают два вызова sched_yield() (в главном потоке и, позже, в функции обслуживания созданного потока) – они предназначены для того, чтобы гарантировать завершение копирования потоком дескриптора сокета (полученного в качестве параметра) до его повторного переопределения в цикле вызывающего потока.
Результаты выполнения такого варианта программы:
$ sudo nice -n19 ./ech2 waiting on port 51005 ... $ ./cli -a 192.168.1.5 -p 51005 -n 20 host: 192.168.1.5, TCP port = 51005, number of echoes = 20 time of reply - Cycles [usec.] : 196535150[64030] 742613[241] 676556[220] 647013[210] 563259[183] 658019[214] 657996[214] 642321[209] 551816[179] 653361[212] 661595[215] 649739[211] 644609[210] 711723[231] 637951[207] 651682[212] 647036[210] 663274[216] 726743[236] 625404[203]
Это хорошие устойчивые результаты, промежуточные между последовательным сервером и параллельным сервером с fork(), что и следовало ожидать. Чрезвычайно сильно выражен эффект кэширования – вся обработка последовательности запросов производится на едином (многократно используемом) пространстве адресов.
Назад | Сервер TCP/IP ... много серверов хороших и разных | Вперед |