Chinaunix
标题:
unix网络编程中的线程池问题
[打印本页]
作者:
kkshaq
时间:
2015-06-28 11:38
标题:
unix网络编程中的线程池问题
本帖最后由 kkshaq 于 2015-06-28 11:40 编辑
* include serv08 */
#include "unpthread.h"
#include "pthread08.h"
static int nthreads;
pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;
int
main(int argc, char **argv)
{
int i, listenfd, connfd;
void sig_int(int), thread_make(int);
socklen_t addrlen, clilen;
struct sockaddr *cliaddr;
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: serv08 [ ] <#threads>");
cliaddr = Malloc(addrlen);
nthreads = atoi(argv[argc-1]);
tptr = Calloc(nthreads, sizeof(Thread));
iget = iput = 0;
/* 4create all the threads */
for (i = 0; i < nthreads; i++)
thread_make(i); /* only main thread returns */
Signal(SIGINT, sig_int);
for ( ; ; ) {
clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
Pthread_mutex_lock(&clifd_mutex);
clifd[iput] = connfd;
if (++iput == MAXNCLI)
iput = 0;
[color=Red] if (iput == iget)
err_quit("iput = iget = %d", iput); [/color]//这部分是否有缺陷?
Pthread_cond_signal(&clifd_cond);
Pthread_mutex_unlock(&clifd_mutex);
}
}
/* end serv08 */
void
sig_int(int signo)
{
int i;
void pr_cpu_time(void);
pr_cpu_time();
for (i = 0; i < nthreads; i++)
printf("thread %d, %ld connections\n", i, tptr[i].thread_count);
exit(0);
}
复制代码
最近看unp27章中的服务器模型部分,27.12节是并发服务器程序,主线程统一accept
也就是主线程accept,worker线程工作那么模式。作者处理消费者和生产者问题的时候,使用了条件变量和互斥量达到同步。但是我觉得有些问题
作者在考虑循环队列的问题上,是采用如此的策略,在生产者函数中,如果iput==iget,必然是数组缓冲区满,作者直接采用的是、
if (iput == iget)
err_quit("iput = iget = %d", iput);
也就是说如果生产者的速度,大于消费者的话,我们的主线程只能结束。。这个是不是有待商榷??对应的情况就是,如果多个客户连接连续产生,工作子线程来不及处理的时候,我们的主线程就自己err_quit了。。
有没有更好的办法?(在只采用一个条件变量的条件下)
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2