文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>客户/服务器程序设计范式(9)--并发服务器程序,每..

客户/服务器程序设计范式(9)--并发服务器程序,每..

时间:2010-05-17  来源:marksman201

在上篇<<客户/服务器程序设计范式--并发服务器程序,每个客户一个线程>>中我们说到为每个客户创建一个线程的方式实现并发服务,而实际上,我们可以预先创建一个线程池,并让每个线程各自调用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 [ <host> ] <port#> <#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

相关阅读 更多 +
排行榜 更多 +
斗虫公园手机版下载

斗虫公园手机版下载

休闲益智 下载
武林外传之同福奇缘手机版下载

武林外传之同福奇缘手机版下载

角色扮演 下载
无畏契约源能行动小米服手游下载

无畏契约源能行动小米服手游下载

飞行射击 下载