Наши партнеры

UnixForum





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