Библиотека сайта 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 ... много серверов хороших и разных | Вперед |
