当前位置:网站首页 > Haskell函数式编程 > 正文

条件变量为什么要和互斥一起使用(条件变量为什么要和互斥一起使用函数)



为何条件变量要和互斥量联合使用:
条件变量起到了阻塞和唤醒线程的作用,所以通常互斥锁要和条件变量配合。

一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。pthread_cond_signal(&m_pthreadCond);

这些线程将重新锁定互斥锁并重新测试条件是否满足(pthread_cond_wait返回)。一般说来,条件变量被用来进行线承间的同步。

可以总结为:两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加锁,B线程再加锁时候会被阻塞,直到A释放锁,B再获得锁运行,进程B必须不停的主动获得锁、检查条件、释放锁、再获得锁、再检查、再释放,一直到满足运行的条件的时候才可以(而此过程中其他线程一直在等待该线程的结束),这种方式是比较消耗系统的资源的。而条件变量同样是阻塞,还需要通知才能唤醒,线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,该线程就休眠了,应该仍阻塞在这里,等待条件满足后被唤醒,节省了线程不断运行浪费的资源。这个过程一般用while语句实现。当线程B发现被锁定的变量不满足条件时会自动的释放锁并把自身置于等待状态,让出CPU的控制权给其它线程。其它线程 此时就有机会去进行操作,当修改完成后再通知那些由于条件不满足而陷入等待状态的线程。这是一种通知模型的同步方式,大大的节省了CPU的计算资源,减少了线程之间的竞争,而且提高了线程之间的系统工作的效率。这种同步方式就是条件变量。

 
  

In Thread1:

pthread_mutex_lock(&m_mutex);
pthread_cond_wait(&m_cond,&m_mutex);
pthread_mutex_unlock(&m_mutex);

In Thread2:

pthread_mutex_lock(&m_mutex);
pthread_cond_signal(&m_cond);
pthread_mutex_unlock(&m_mutex);

为什么要与pthread_mutex 一起使用呢?
由于pthread_cond_wait()不是原子操作,这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 释放锁并进入wait_cond状态 ,此时线程2上锁) 的时候才能调用cond_singal.

为什么会出现虚假唤醒,为什么要用while来避免虚假唤醒?

虚假唤醒的出现在于生产者的notify并不在临界区内,也就是说,生产者使用临界区保护了修改流水线的这个操作,然后解锁,解锁完毕后才notify。而在这之间是非原子的。

在以下情况:

1).生产者对临界区加锁

2).修改流水线状态

3).生产者解锁

4).notify通知生产者线程

在3)与4)间是有空隙的,如果在3)进行后突然此刻加入了一个新的生产者,这个生产者察觉到流水线的变化,对他进行了消费,然后消费者才notify,notify唤醒了原有的消费者, 但流水线已经为空了,实际上这就是一个虚假唤醒,唤醒后并无工作可做。

因此不能用if来进行条件判断,加入while就可以避免虚假唤醒,在每次唤醒后先判断流水线条件,这样避免了虚假唤醒的情况。

到此这篇条件变量为什么要和互斥一起使用(条件变量为什么要和互斥一起使用函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 淘宝支付方式怎么设置(淘宝支付方式怎么设置默认支付宝)2025-06-27 23:18:08
  • 支付方式pos是什么(pos机支付方式有哪些)2025-06-27 23:18:08
  • 报文格式有哪些(报文格式大全 chm)2025-06-27 23:18:08
  • udp报文格式英文(udp报文长度一般是多少)2025-06-27 23:18:08
  • 单片机编程程序代码(单片机编程程序代码大全)2025-06-27 23:18:08
  • max开窗函数(开窗函数row number)2025-06-27 23:18:08
  • 连接redis哨兵模式(redis哨兵模式哨兵挂了)2025-06-27 23:18:08
  • ceph容量损耗(ceph容量损耗计算公式)2025-06-27 23:18:08
  • sigmoid函数和tanh函数(tanh函数和sigmoid关系)2025-06-27 23:18:08
  • 工资支付方式有哪些(工资支付主要包括哪些内容)2025-06-27 23:18:08
  • 全屏图片