Linux——线程4|线程同步

文章介绍了线程同步的概念,强调了其在解决临界资源访问问题中的重要性。条件变量作为同步机制的一部分,允许线程在资源不就绪时等待,并在条件满足时被通知。通过示例展示了如何使用pthreadCond系列函数进行线程的等待与唤醒,以及在实际操作中需要注意的同步和互斥问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步:主要是为了解决访问临界资源合理性问题的(如抢票的时候不能只让一个进程把所有的票抢走),同步是按照一定的顺序,进行临界资源的访问。

条件变量

申请临界资源前,先检测临界资源是否存在,要做检测的本质:也是访问临界资源!因此:对临界资源的检测,也一定是在加锁和解锁之间的。常规方式要检测条件就绪,就注定了我们必须频繁申请和释放锁。

有没有办法让我们的线程检测到资源不就绪的时候?

  1. 不要让线程再频繁自己检测啦,让线程进行等待。

  1. 当条件就绪的时候,通知对应的线程,让他来进行资源申请和访问。

当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。

例如一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这种情

况就需要用到条件变量。

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问

题,叫做同步

竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解

初始化pthread_cond_init

如果定义的是全局的,静态的可用最下面的PTHREAD_COND_INITIALIZER

如果定义的是局部条件变量,用第二个进行初始化

等待某种条件pthread_cond_wait

pthread_cond_timedwait多了一个timespec参数这个表示时间,这是设置等待时间的,这个接口我们了解即可。

pthread_cond_wait是在特定的条件变量下去等,这里面参数多了个互斥锁,这个锁的起到一定的安全作用(要保证同步和互斥),第一个参数是让线程在特定的条件变量下(我们可理解为变量),第二个是锁

发送通知pthread_cond_signal

第一个接口相当于不止有一个线程在等资源就绪,broadcast作用是把所有线程全部唤醒。

第二个接口是唤醒指定的一个线程。

使用接口小实验

我们创建多个线程,其中有一个主线程,主线程会按照一定的顺序唤醒其它线程。

单个线程唤醒

接下来我们想让哪个线程去运行,就唤醒哪个线程,我们去掉4个线程的sleep

我们发现线程是按照顺序唤醒的,因为这些线程在条件变量不满足时,此时会在该线程下排队等待,因此主线程在唤醒线程时会一个一个唤醒。因为是队列,所以有序。

我们也可以唤醒一批线程

进行10次唤醒线程

接下来我们唤醒线程10次,之后让系统整体全部退出。

我们设计一个标志位和cnt计数,并修改func函数里面的while循环

10次循环结束后,我们发现程序卡住了

换用broadcast,同样唤醒10次后,程序也卡住了

出现这种现象是因为我们写的这部分代码是不全面的

这里的wait一定要在加锁和解锁之间进行wait,而且主线程这里要进行一次唤醒

此时程序运行正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发没有代码多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值