Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265272
  • 博文数量: 74
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 793
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 21:01
文章分类

全部博文(74)

文章存档

2011年(1)

2010年(32)

2009年(32)

2008年(9)

我的朋友

分类: LINUX

2010-05-17 12:57:55

在上篇<<客户/服务器程序设计范式--并发服务器程序,每个客户一个线程>>中我们说到为每个客户创建一个线程的方式实现并发服务,而实际上,我们可以预先创建一个线程池,并让每个线程各自调用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) |
给主人留下些什么吧!~~