免费注册 查看新帖 |

Chinaunix

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

pthread_mutex_lock的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-09 08:58 |只看该作者 |倒序浏览
一下代码源于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为什么还能锁定呢?

论坛徽章:
0
2 [报告]
发表于 2006-02-10 11:02 |只看该作者
原来Pthread_cond_wait会unlock
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP