免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2080 | 回复: 0
打印 上一主题 下一主题

[Linux] unix网络编程中的线程池问题 [复制链接]

论坛徽章:
1
2015亚冠之浦和红钻
日期:2015-05-26 14:37:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-28 11:38 |只看该作者 |倒序浏览
本帖最后由 kkshaq 于 2015-06-28 11:40 编辑
  1. * include serv08 */
  2. #include "unpthread.h"
  3. #include "pthread08.h"

  4. static int nthreads;
  5. pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
  6. pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;

  7. int
  8. main(int argc, char **argv)
  9. {
  10.     int i, listenfd, connfd;
  11.     void sig_int(int), thread_make(int);
  12.     socklen_t addrlen, clilen;
  13.     struct sockaddr *cliaddr;

  14.     if (argc == 3)
  15.         listenfd = Tcp_listen(NULL, argv[1], &addrlen);
  16.     else if (argc == 4)
  17.         listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
  18.     else
  19.         err_quit("usage: serv08 [ ] <#threads>");
  20.     cliaddr = Malloc(addrlen);

  21.     nthreads = atoi(argv[argc-1]);

  22.     tptr = Calloc(nthreads, sizeof(Thread));

  23.     iget = iput = 0;

  24.         /* 4create all the threads */
  25.     for (i = 0; i < nthreads; i++)
  26.         thread_make(i); /* only main thread returns */

  27.     Signal(SIGINT, sig_int);

  28.     for ( ; ; ) {
  29.         clilen = addrlen;
  30.         connfd = Accept(listenfd, cliaddr, &clilen);

  31.         Pthread_mutex_lock(&clifd_mutex);
  32.         clifd[iput] = connfd;
  33.         if (++iput == MAXNCLI)
  34.             iput = 0;
  35.       [color=Red]  if (iput == iget)
  36.             err_quit("iput = iget = %d", iput);         [/color]//这部分是否有缺陷?
  37.         
  38.       Pthread_cond_signal(&clifd_cond);
  39.         Pthread_mutex_unlock(&clifd_mutex);
  40.     }
  41. }
  42. /* end serv08 */

  43. void
  44. sig_int(int signo)
  45. {
  46.     int i;
  47.     void pr_cpu_time(void);

  48.     pr_cpu_time();

  49.     for (i = 0; i < nthreads; i++)
  50.         printf("thread %d, %ld connections\n", i, tptr[i].thread_count);

  51.     exit(0);
  52. }
复制代码
最近看unp27章中的服务器模型部分,27.12节是并发服务器程序,主线程统一accept
也就是主线程accept,worker线程工作那么模式。作者处理消费者和生产者问题的时候,使用了条件变量和互斥量达到同步。但是我觉得有些问题
作者在考虑循环队列的问题上,是采用如此的策略,在生产者函数中,如果iput==iget,必然是数组缓冲区满,作者直接采用的是、
if (iput == iget)
            err_quit("iput = iget = %d", iput);

也就是说如果生产者的速度,大于消费者的话,我们的主线程只能结束。。这个是不是有待商榷??对应的情况就是,如果多个客户连接连续产生,工作子线程来不及处理的时候,我们的主线程就自己err_quit了。。
有没有更好的办法?(在只采用一个条件变量的条件下)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP