UNIXネットワークプログラミングボリューム1サーバプログラム設計ファン7は、あらかじめスレッドを作成し、相互にロックすることでacceptを保護します.

2451 ワード

この記事はsenlieオリジナルです.転載はこの住所を残してください.http://blog.csdn.net/zhengsenlie
1.あらかじめスレッドを作成し、各スレッドにaccept 2を呼び出してもらいます.各スレッドをaccept呼出し中に閉塞させるために、相互反発ロックで置換します.
//                Thread   
typedef struct {
  pthread_t		thread_tid;		/*    ID */
  long			thread_count;	/*        */
} Thread;
Thread	*tptr;		/* Thread     ,      calloc     Thread     */


//    ,                        
int				listenfd, nthreads;
socklen_t		addrlen;
pthread_mutex_t	mlock;




/* include serv07 */
#include	"unpthread.h"
#include	"pthread07.h"


pthread_mutex_t	mlock = PTHREAD_MUTEX_INITIALIZER;


int
main(int argc, char **argv)
{
	int		i;
	void	sig_int(int), thread_make(int);


	//1.       
	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv07 [ <host> ] <port#> <#threads>");
	
	//2.                      
	nthreads = atoi(argv[argc-1]);
	tptr = Calloc(nthreads, sizeof(Thread));


	//3.   thread_make       
	for (i = 0; i < nthreads; i++)
		thread_make(i);			/*          */


	//4.       SIGINT      
	Signal(SIGINT, sig_int);


	//5.          ,       pause() 
	for ( ; ; )
		pause();	/* everything done by threads */
}
/* end serv07 */




//     SIGINT     
void
sig_int(int signo)
{
	int		i;
	void	pr_cpu_time(void);


	//   pr_cpu_time         
	//                        SIGTERM          。
	//       ,                  ,       ,       。
	pr_cpu_time();


	for (i = 0; i < nthreads; i++)
		printf("thread %d, %ld connections
", i, tptr[i].thread_count); exit(0); } void thread_make(int i) { void *thread_main(void *); // thread_main , Thread Pthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i); return; /* main thread returns */ } void * thread_main(void *arg) { int connfd; void web_child(int); socklen_t clilen; struct sockaddr *cliaddr; cliaddr = Malloc(addrlen); printf("thread %d starting
", (int) arg); for ( ; ; ) { clilen = addrlen; // accept pthread_mutex_lock pthread_mutex_unlock Pthread_mutex_lock(&mlock); connfd = Accept(listenfd, cliaddr, &clilen); Pthread_mutex_unlock(&mlock); tptr[(int) arg].thread_count++; web_child(connfd); /* process request */ Close(connfd); } }