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

全部博文(74)

文章存档

2011年(1)

2010年(32)

2009年(32)

2008年(9)

我的朋友

分类: LINUX

2010-05-17 12:55:17

每个客户一个线程的方式和一个客户一个进程的方式比较相似,其核心步骤大体如下:
    for ( ; ; ) {
        connfd = Accept(listenfd, cliaddr, &clilen);

        Pthread_create(&tid, NULL, &doit, (void *) connfd);
    }
可以将accept返回的连接套接字作为参数传递给线程函数。

这部分代码也比较简单:
serv06.c
-----------------------------

/* include serv06 */
#include "unpthread.h"

int
main(int argc, char **argv)
{
    int listenfd, connfd;
    void sig_int(int);
    void *doit(void *);
    pthread_t tid;
    socklen_t clilen, addrlen;
    struct sockaddr *cliaddr;

    if (argc == 2)
        listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    else if (argc == 3)
        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    else
        err_quit("usage: serv06 [ ] ");
    cliaddr = Malloc(addrlen);

    Signal(SIGINT, sig_int);

    for ( ; ; ) {
        clilen = addrlen;
        connfd = Accept(listenfd, cliaddr, &clilen);

        Pthread_create(&tid, NULL, &doit, (void *) connfd);
    }
}

void *
doit(void *arg)
{
    void web_child(int);

    Pthread_detach(pthread_self());
    web_child((int) arg);
    Close((int) arg);
    return(NULL);
}
/* end serv06 */

void
sig_int(int signo)
{
    void pr_cpu_time(void);

    pr_cpu_time();
    exit(0);
}



doit函数先让自己脱离,使得主线程不必等待它,然后调用web_child函数。

这种为每个客户创建一个线程的方式比为每个客户创建一个进程的方式要快很多:

$ ./serv06 173.26.100.162 12345

user time = 0.012, sys time = 0.128008

源代码包见<<客户/服务器程序设计范式---迭代服务器程序>>后附件

阅读(1247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~