互斥与同步

今天来简单地学习Linux中的编发编程,介绍一下互斥和线程同步。

竞争条件

当两个或多个进程试图在同一时刻访问共享内存,或读写某 些共享数据,而最后的结果取决于线程执行的顺序(线程运行时序),就称为竞争条件

如果没有同步机制,多道程序设计很容易因为竞争条件而出现不是我们所期待或者是错误的结果

临界区

对共享变量,共享内存,共享资源进行访问的程序片度叫做临界区

互斥

在某些提供指令的机器可以用于解决临界区互斥的问题,这个指令能检查并设置内存的值,而不会被打断。工作原理大致是这样的:

注意:这个函数中三条指令是执行的,也就是说不会被打断。

使用方法:

信号量

除了使用指令来解决互斥问题,还可以使用更加强大的信号量。

如上图所示,对于一个互斥的信号量(比如互斥锁),count属性会被初始化为1,代表最多一个任务可以获得这个信号量。

当一个任务调用方法——这个方法会对减少count值,如果新的count值大于0(获得信号量)则会立即返回执行接下来的代码,否则,这个任务会被进入睡眠,即放到信号量的等待队列。之后,当一个已经获得信号量的任务完成之后,调用方法,count值就会增加,等待队列中的所有任务都会被唤醒。

从上面的描述可知,使用信号量不仅可以解决互斥的问题,还可以解决同步的问题。

使用信号量解决互斥的伪代码:

使用信号量解决生产者-消费者同步问题伪代码:

注意:当然对信号量的down和up操作是在内核中实现的,并且屏蔽了中断,否则count本身也会出现竞争条件。

总结

本文不但学习了指令实现互斥,还学习了更加强大的信号量来解决同步问题。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190130G0EAAN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券