加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux下条件变量和信号量分别是啥意思

发布时间:2023-09-02 10:35:09 所属栏目:Linux 来源:未知
导读:   在实际应用中,我们有时候会遇到“Linux下条件变量和信号量分别是什么意思”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Linux下条件变量和
  在实际应用中,我们有时候会遇到“Linux下条件变量和信号量分别是什么意思”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Linux下条件变量和信号量分别是什么意思”文章能帮助大家解决问题。
 
  区别:1、使用条件变量可以一次唤醒所有等待者,而信号量不能唤醒;2、信号量始终有一个值(状态),而条件变量是没有值的,没有地方记录发送信号的次数,也没有地方记录wait返回的次数;3、信号量的意图在于进程间同步,条件变量意图在于线程间同步。

  本教程操作环境:linux5.9.8系统、Dell G3电脑。
 
  条件变量
 
  条件变量(cond)使在多线程程序中用来实现“等待--->唤醒”逻辑常用的方法,是进程间同步的一种机制。条件变量用来阻塞一个线程,直到条件满足被触发为止,通常情况下条件变量和互斥量同时使用。
 
  一般条件变量有两个状态:
 
  (1)一个/多个线程为等待“条件变量的条件成立“而挂起;
 
  (2)另一个线程在“条件变量条件成立时”通知其他线程。
 
  条件变量的使用:
 
  #include <pthread.h>
 
  struct msg {
 
      struct msg *m_next;
 
      /* ... more stuff here ... */
 
  };
 
  struct msg *workq;
 
  pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
 
  pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
 
  void
 
  process_msg(void)
 
  {
 
      struct msg *mp;
 
      for (;;) {
 
          pthread_mutex_lock(&qlock);
 
          while (workq == NULL)
 
              pthread_cond_wait(&qready, &qlock);
 
          mp = workq;
 
          workq = mp->m_next;
 
          pthread_mutex_unlock(&qlock);
 
          /* now process the message mp */
 
      }
 
  }
 
  void
 
  enqueue_msg(struct msg *mp)
 
  {
 
      pthread_mutex_lock(&qlock);
 
      mp->m_next = workq;
 
      workq = mp;
 
      pthread_mutex_unlock(&qlock);
 
      pthread_cond_signal(&qready);
 
  }
 
  当然,在触发条件变量时也可以用以下代码,两种方式各有优劣
 
  void
 
  enqueue_msg(struct msg *mp)
 
  {
 
      pthread_mutex_lock(&qlock);
 
      mp->m_next = workq;
 
      workq = mp;
 
      pthread_cond_signal(&qready);
 
      pthread_mutex_unlock(&qlock);
 
  }
 
  信号量
 
  信号量是一种特殊的变量,访问具有原子性。
 
  只允许对它进行两个操作:
 
  (1)等待信号量
 
  当信号量值为0时,程序等待;当信号量值大于0时,信号量减1,程序继续运行。
 
  (2)发送信号量
 
  将信号量值加1。
 
  说明:Linux提供了一组信号量API,声明在头文件sys/sem.h中。
 
  linux 条件变量和信号量的区别:
 
  (1)使用条件变量可以一次唤醒所有等待者,而这个信号量没有的功能,感觉是最大区别。
 
  (2)信号量始终有一个值(状态的),而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。从实现上来说一个信号量可以是用mutex + counter + condition variable实现的。因为信号量有一个状态,如果想精准的同步,那么信号量可能会有特殊的地方。信号量可以解决条件变量中存在的唤醒丢失问题。
 
  (3)信号量的意图在于进程间同步,互斥锁和条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。应当根据实际的情况进行决定。信号量最有用的场景是用以指明可用资源的数量。
 
  经典的一句话:
 
  互斥量是信号量的一种特例,互斥量的本质是一把锁。
 

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章