首页 > 其他分享 >什么时候只用互斥锁就可以,什么时候用条件变量+互斥锁

什么时候只用互斥锁就可以,什么时候用条件变量+互斥锁

时间:2023-06-11 19:23:02浏览次数:31  
标签:加锁 阻塞 互斥 时候 线程 条件 只用 资源

互斥锁的作用是确保在同一时刻只有1个线程访问共享资源

而条件变量的作用是,虽然某个线程加锁成功,可以访问共享资源了,但是这个时候如果某个条件没有变为true,那么这个线程也会被阻塞,直到其他线程调用notify_one来唤醒他,告诉他现在这个条件变为true了,他才可以访问共享资源

比如在生产者-消费者模型中,消费者加锁成功,获得了访问资源队列的资格,但是这时候资源队列有可能空的,如果只用互斥锁,那么我们需要先判断一下资源队列是否为空,如果为空的话就直接退出访问并释放锁。

然后线程再次循环访问,再次尝试加锁,又重复上面这个过程。。。

如果我们使用条件变量,将条件设置为队列不为空时等于true,那么当线程加锁成功,但条件变量为false(资源队列为空)时,线程就被阻塞。。。直到某个生产者线程往里面生产资源后,这个生产者线程在调用notify_one来唤醒被阻塞的消费者线程,

相当于告诉他(实际上是所有被阻塞的线程都会被唤醒,但只有一个能加锁成功,其他则继续被阻塞)现在资源队列里有资源了,你可以来拿了,这时候消费者线程再去访问资源队列,就不会有上面循环访问的问题。

 

总结:

条件变量的作用是,在某些多线程场景中,即使线程互斥锁加锁成功,获得了访问共享资源的权限,但如果没有达到某些条件,那么访问了也没用,只有在某些条件为true的情况下访问才有效。

这个时候可以把这个条件设置为条件变量,条件变量为false时线程会被阻塞,条件为true时再通过notify_one接口来唤醒被阻塞的线程,可以防止线程重复进行无效访问。

 

标签:加锁,阻塞,互斥,时候,线程,条件,只用,资源
From: https://www.cnblogs.com/tan-wm/p/17473422.html

相关文章

  • QT多线程(线程互斥)
    (文章目录)前言线程互斥是指在多线程并发执行时,为避免多个线程访问共享资源时发生冲突而采取的一种机制。本篇文章我们就这个问题来了解一下什么叫线程互斥,又如何解决线程互斥的问题。一、导致问题产生的原因和解决方法如果多个线程同时访问同一共享资源,可能会导致数据不一致......
  • 30岁,还像小时候一样,盼过年,幼稚么?
    30岁,还像小时候一样,盼过年,幼稚么?星云_fighting关注IP属地:江西22023.01.1306:09:57字数1,303阅读246光阴似箭,岁月如梭,往事如风,一个不留神,就匆匆忙忙跨过了三十岁的门槛,昔日的少年已多了几分沧桑,昔日的温馨家庭,也在斗转星移里,变得愈发冷清起来,冷的几近压抑,穷的几近麻......
  • 定积分上下限为什么有时候需要变有时候不需要不变?
    简单的说就是:能在式子中看到原来的积分变量就不需要重新计算积分上下限,否则就需要重新确定积分上下限,这里还有一个具体的例子和更加详细的说明可以帮助我们理解这个问题:定积分运算时的积分上下限:什么时候变?什么时候不变?——荒原之梦考研数学......
  • qt按钮切换互斥功能
    有这样一种功能:一组按钮,点击其中一个,该按钮被选中,其他按钮取消选中。  我这里简单说一下方法。创建一个继承自QFrame的窗口类,在上面放几个按钮,按钮属性设置如下:然后设置按钮的qss,下面是其中一个的按钮(其他按钮类似):data文件夹和exe所在的文件夹在同一目录,下面有几个图片......
  • pr 添加马赛克跟踪的时候如何同步预览
    一些对比不鲜明的场景还是要边跟踪边预览的万一跟踪丢失随时停止减少时间浪费如下点击蒙版路径小扳手,勾选预览  会额外消耗一些资源 ......
  • lstm中训练的时候点到点,改成点到图的,通常怎么改
    如果您希望将LSTM的点到点训练转换为点到图的训练,可以采取以下步骤进行修改:调整输入数据的形状:点到点的训练输入是一个时间序列的点,而点到图的训练需要将时间序列转换为图结构。您可以使用时间窗口滑动的方式,将多个连续时间步的点作为一个图的节点,从而形成图的结构。每个时间步......
  • select 多选回显的时候input高度问题
    select多选回显的时候input高度没撑开内容超出setTimeout(function(){if(document.querySelector('.el-cascader__tags')){document.querySelector('#el-cascader.el-input__inner').style.setProperty('height',`${document......
  • UE(UltraEdit)窗口展示的时候,变成了下拉,如何解决(ue如何显示所有标签)
    电脑重装后,UE窗口的标签默认变成了默认下拉形式的,使用非常不方便,调整会原来的平铺形式方法:高级-->>设置-->文件标签操作---勾选复现 ......
  • android应用启动的时候添加图片,并设置跳过按钮
    要在显示图片时添加跳过按钮,可以使用AndroidSDK提供的splashscreen资源文件,并在布局文件中使用。以下是添加跳过按钮的一般步骤:1.在AndroidManifest.xml文件中的应用程序标签中添加以下行:android:splashScreen="res/drawable/splash_screen.png"这将指定使用spla......
  • 【转】git的分支什么时候用
    转自https://zhuanlan.zhihu.com/p/631382940Git的分支功能可以让你在同一代码库中独立地开发不同的功能或修复不同的bug,而不会影响主干分支的稳定性。以下是使用Git分支的一些情况:开发新功能:如果你需要开发一个新的功能,可以在主干分支上创建一个新的分支,然后在该分支上进......