`
kenby
  • 浏览: 716866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正确使用pthread_cond_wait

阅读更多

消费者的两种等待方式:

方式1: 

if (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


方式2:

while (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


说明:

方式1的等待存在问题, 如果多个消费者都在等待queue_has_element, 此时, 生产者产生

一个元素, 并调用pthread_cond_broadcast把所有消费者都惊醒, 而元素确只有一个, 这

意味着只有一个消费者可以得到这个元素, 其余消费者应该继续等. 但是方式1. 所有消费者

不等待, 去一个空队列取元素将会发生错误. 方式2是正确的处理方式. 每个消费者醒了之后,

还会检查一次队列, 如果队列依然为空, 则继续等待... 


PS: 如果使用pthread_cond_broadcast来广播信号, 条件变量满足后, 不一定真的代表资

源满足. 只有在使用pthread_cond_signal的情况下, 条件变量的满足才意味着资源也满足.

 

 

分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    以下是对pthread_cond_wait的用法进行了详细的分析介绍,需要的朋友可以过来参考下

    信号pthread_cond_wait

    信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait

    pthread_cond_wait详解

    一篇博客内容 pthread_cond_wait详解

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.zip

    Linux多线程之条件阻塞代码

    Linux多线程之条件阻塞代码 包含mutex 与pthread_cond_wait,pthread_cond_signal的应用 详细内容见readme.txt

    数码天空破解文件cccam205

    libpthread.so.0 pthread_cond_wait recv connect pthread_create send accept pthread_cond_signal pthread_cond_init pthread_mutex_unlock pthread_mutex_lock pthread_mutex_init _Jv_RegisterClasses close ...

    Linux多线程编程,替代sleep的几种方式

    我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能达不到,我们想要的效果...  采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timesp

    linux c++线程

    本人主要想练习一下socket c++ 多...现在遇到的问题是,不知道咋回事,主线程 pthread_cond_signal (&cond) 发送的条件 似乎 新的线程 pthread_cond_wait (&cond, &mutex) 没有收到,不知是不是发生传说中的死锁???

    互斥锁和条件锁的讲解和使用

    使用pthread_cond_wait前要先加锁 2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活 3。pthread_cond_wait被激活后会再自动加锁 激活线程: 1。加锁(和等待线程用同一个锁) 2。pthread_cond_...

    Linux线程同步之条件变量

     等待 pthread_cond_wait  满足条件给向进程发送信号 pthread_cond_signal  下面程序展示了利用条件变量等待另外两个线程满足条件时,第三个进程继续向前执行 #include #include <pthread> #include p

    嵌入式的多线程应用程序设计

    pthread_cond_wait(&b->notfull, &b->lock); } /* Write the data and advance write pointer */ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /*...

    浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费...pthread_cond_wait(qcond,qlock); 或者 pthread_cond_wait(qcond,qlock,timeout); reset条件变量… pthread_mutex_unlock(qlock);

    golang模拟实现带超时的信号量示例代码

    pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); 然后在查看golang的document后,发现golang里并没有实现带超时的信号量,官方文档在这里。 原理 我的...

    linux C++ 实现线程池(避免线程创建的耗时)

    linux下c++写的线程池,可以了解pthread_cond_timewait和pthread_detach的用法,自定义最大使用的线程数量,线程退出线程池的超时时间,任务优先级处理。

    多线程互斥锁和条件变量demo

    基于多线程,学习互斥锁和pthread_cond_wait条件变量实现的demo, 初学者学习。

    cpp-C实现的定时器

    开启线程,利用小根堆存时间事件,pop出最近的事件,假如到时间就执行, 一直pop,直到堆顶离执行还有x秒,线程等待x秒,等待可以采用epoll_wait 的超时,这里采用的是线程锁信号量pthread_cond_timedwait的超时。

    vxworks 并发服务器程序

    // pthread_cond_wait(&client;_list->cond, &client;_list->mutex); // } //遍历链表 temp = client_list->client_head.next; while (temp != &client;_list ->client_head) { /* 将socket描述符加入读描述...

    linux线程间的同步与互斥知识点总结

    在线程并发执行的时候,我们需要保证临界资源的安全访问,防止...pthread_cond_wait 条件不满足 会释放锁并阻塞等待 , 这个函数是原子性操作:1.将线程放入条件等待队列 2.释放锁  条件满足 则线程会被唤醒并加锁 pthr

    linux pthread 多线程控制示例代码

    一个示例程序,演示在linux环境下如何使用pthread实现多线程的使用和控制。

Global site tag (gtag.js) - Google Analytics