- 論壇徽章:
- 1
|
[code]/* 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;
if (iput == iget)
err_quit("iput = iget = %d", iput);
Pthread_cond_signal(&clifd_cond);
Pthread_mutex_unlock(&clifd_mutex);
}
}
最近看unp27章中的服務(wù)器模型部分,27.12節(jié)是并發(fā)服務(wù)器程序,主線程統(tǒng)一accept
也就是主線程accept,worker線程工作那么模式。作者處理消費(fèi)者和生產(chǎn)者問(wèn)題的時(shí)候,使用了條件變量和互斥量達(dá)到同步。但是我覺(jué)得有些問(wèn)題
作者在考慮循環(huán)隊(duì)列的問(wèn)題上,是采用如此的策略,在生產(chǎn)者函數(shù)中,如果iput==iget,必然是數(shù)組緩沖區(qū)滿,作者直接采用的是、
if (iput == iget)
err_quit("iput = iget = %d", iput);
也就是說(shuō)如果生產(chǎn)者的速度,大于消費(fèi)者的話,我們的主線程只能結(jié)束。。這個(gè)是不是有待商榷??對(duì)應(yīng)的情況就是,如果多個(gè)客戶連接連續(xù)產(chǎn)生,工作子線程來(lái)不及處理的時(shí)候,我們的主線程就自己err_quit了。。
有沒(méi)有更好的辦法?(在只采用一個(gè)條件變量的條件下)
|
|