zoukankan      html  css  js  c++  java
  • pthread_cond_wait

    while(1)
    33 {
    34 mm* p = NULL;
    35 pthread_mutex_lock(&mutex);
    36 while(head == NULL)
    37    pthread_cond_wait(&cond, &mutex);
    38 p = head->next;
    39 printf("consumer %ld expense %d ",pthread_self(), head->num);
    40 free(head);
    41 head = p;
    42 pthread_mutex_unlock(&mutex);
    43 }

    这里调用pthread_cond_wait等待条件的发生时,mutex会被自动释放。而且pthread_cond_wait中的两个步骤必须是原子性的;

    • 把调用线程放到条件等待队列上
    • 释放mutex

    调用这个函数进行等待条件的发生时,mutex会被自动释放

    signal到底是放在unlock之前还是之后??

    void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }

    如果把signal放在unlock之前,消费者线程会被唤醒,获取mutex发现获取不到,就又去sleep了。浪费了资源.但是在LinuxThreads或者NPTL里面,就不会有这个问题,因为在Linux 线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。
    所以在Linux中推荐使用这种模式。

  • 相关阅读:
    on和where的区别
    分组查询 group by having 排序 order by asc(升序)或desc(降序)
    连接查询 left join on, union
    md5加密方法
    where查询条件的指定,between and,in,like
    Mapnix(转) Anny
    Rolebased access control(RBAC) Anny
    TestComplete如何识别对象(转) Anny
    Jira workflow Anny
    crx文件 Anny
  • 原文地址:https://www.cnblogs.com/xpylovely/p/11546540.html
Copyright © 2011-2022 走看看