UNIXネットワークプログラミングボリューム1サーバプログラム設計ファン7は、あらかじめスレッドを作成し、相互にロックすることでacceptを保護します.
2451 ワード
この記事はsenlieオリジナルです.転載はこの住所を残してください.http://blog.csdn.net/zhengsenlie
1.あらかじめスレッドを作成し、各スレッドにaccept 2を呼び出してもらいます.各スレッドをaccept呼出し中に閉塞させるために、相互反発ロックで置換します.
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);
}
}