- 论坛徽章:
- 0
|
一下代码源于http://www.unpbook.com/unpv13e.tar.gz,在unpv13e/server下.
pthread08.c:
#include "unpthread.h"
#include "pthread08.h"
void
thread_make(int i)
{
void *thread_main(void *);
Pthread_create(&tptr.thread_tid, NULL, &thread_main, (void *) i);
return; /* main thread returns */
}
void *
thread_main(void *arg)
{
int connfd;
void web_child(int);
printf("thread %d starting\n", (int) arg);
for ( ; ; ) {
Pthread_mutex_lock(&clifd_mutex);
printf("thread %d lock return\n",(int)arg);
while (iget == iput) {
Pthread_cond_wait(&clifd_cond, &clifd_mutex);
//printf("thread %d cond_wait return\n",(int)arg);
}
connfd = clifd[iget]; /* connected socket to service */
if (++iget == MAXNCLI)
iget = 0;
Pthread_mutex_unlock(&clifd_mutex);
tptr[(int) arg].thread_count++;
web_child(connfd); /* process request */
Close(connfd);
}
}
serv08.c:
#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 [ <host> ] <port#> <#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);
printf("main thread lock return ");
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);
}
}
编译后,运行:
pxb$ serv08 127.0.0.1 8888 3 /*侦听于127.0.0.1,端口:8888,线程池为3*/
thread 0 starting
thread 0 lock return
thread 2 starting
thread 2 lock return
thread 1 starting
thread 1 lock return
到这里,我觉得奇怪,pthread_mutex_lock在thread 0已锁定后,thread 2,1为什么还能锁定呢? |
|