在上篇
<<客户/服务器程序设计范式--并发服务器程序,每个客户一个线程>>中我们说到为每个客户创建一个线程的方式实现并发服务,而实际上,我们可以预先创建一个线程池,并让每个线程各自调用accept,并且为了不让每个线程都阻塞在accept调用中,我们用互斥锁以保证任何时刻只有一个线程在调用accept。
这里,我们用定义一个包含线程若干信息的线程结构,然后用这种结构的一个数组来保存所以线程的信息。
pthread07.c
----------------------
typedef struct { pthread_t thread_tid; /* thread ID */ long thread_count; /* # connections handled */ } Thread; Thread *tptr; /* array of Thread structures; calloc'ed */
int listenfd, nthreads; socklen_t addrlen; pthread_mutex_t mlock;
|
在main函数中tptr指向Calloc申请的用户指定数量的线程结构。而在每一个线程函数中,thread_main函数在调用accept前后调用pthread_mutex_lock和pthread_mutex_unlock加以保护。
serv07.c
------------------------
/* 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);
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 [ ] <#threads>"); nthreads = atoi(argv[argc-1]);
/* array of Thread structures; calloc'ed */ tptr = Calloc(nthreads, sizeof(Thread));
for (i = 0; i < nthreads; i++) thread_make(i); /* only main thread returns */
Signal(SIGINT, sig_int);
for ( ; ; ) pause(); /* everything done by threads */ } /* end serv07 */
void sig_int(int signo) { int i; void pr_cpu_time(void);
pr_cpu_time();
for (i = 0; i < nthreads; i管理员在2009年8月13日编辑了该文章文章。 -->
阅读(1117) | 评论(0) | 转发(0) |
|