zoukankan      html  css  js  c++  java
  • pthread_cond_broadcast用处

    以前学习POSIX THREAD时就不太理解broadcast在什么场景下使用比较合适。因为broadcast的语义是唤醒所有被阻塞的线程。

    当时的想法是,在系统析构时调用它比较有效,唤醒阻塞的线程,回收线程资源,然后退出系统。

    今天在做 lock_server 时,才了解到broadcast的用处,它的效果是,减少系统中条件变量的个数

    需求

    系统中有很多锁,锁有FREE和LOCKED两种状态。不同的client会申请自己需要的锁,server响应client的申请。假如client申请的锁已被占用,那么client应该阻塞,等待锁被释放。

    设计1 

    client阻塞在它需要的那个锁上,应该是pthread_cond_wait(&lockid, &mutex)

    这样设计的话,对于每一个锁,都需要一个对应的条件变量,这样设计增加了系统的复杂性

    设计2 应用broadcast

    系统中设置一个共享的条件变量 cond,所有的线程阻塞在cond上

    	while(lock_status_[lid] == LOCKED) {
    		pthread_cond_wait(&c_, &m_);
    	}	
            pthread_cond_broadcast(&c_);    
    

    这样,一旦某个锁被释放,所有的阻塞线程都会被唤醒,但唯有阻塞在这个锁的线程才能真正被唤醒。

    另外,mutex的使用,保证了最多一个线程被真正唤醒,即便是broadcast。

  • 相关阅读:
    WebSocket
    Spring Web MVC
    对象关系映射(ORM)数据访问
    使用JDBC进行数据访问
    【Mysql】【基础综合题解】大一下学期数据库综合训练题解
    【Mysql】【解决问题】[Err] 1055
    【JavaSE】【IO流】复制单级或多级文件夹
    C#使用FFmpeg的总结
    C#一个IM系统简单总结
    重新开启博客
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3781511.html
Copyright © 2011-2022 走看看