linux并发同步之基础概念(竞态,并发,临界区)

本文介绍了竞态条件的概念及其在多线程或多进程环境中的影响。通过实例展示了竞态条件如何因并发而导致程序行为偏离预期,并探讨了临界区的重要性及其实现方法。

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

竞态(race condition

    软件层面上,竞态是指 多个线程或进程读写一个共享资源(或共享设备)时的输出结果依赖于线程或进程的先后执行顺序或者时间;(更权威的介绍可以看wiki--https://en.wikipedia.org/wiki/Race_condition).

   至于为什么会发生竞态呢?很简单,因为并发,并发使多线程,多进程环境变成可能。

   竞态具体场景:假如我们有2个进程会对一个全局变量进行++操作,理想时,程序会这样执行:

Thread 1

Thread 2

 

Integer value

 

 

 

0

read value

 

0

increase value

 

 

0

write back

 

1

 

read value

1

 

increase value

 

1

 

write back

2



   然而,由于并发的普遍存在,使得情况有时”不受控制”(不如工程师预期那样工作),可能会变成这样:

Thread 1

Thread 2

 

Integer value

 

 

 

0

read value

 

0

 

read value

0

increase value

 

 

0

 

increase value

 

0

write back

 

1

 

write back

1



并发(concurrency

   并发(concurrency)指的是多个执行单元同时、并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局、静态变量)的访问则容易导致竞态(race conditions),可能导致并发(即竞态?)的情况有:


1)SMP(Symmetric Multi-Processing),对称多处理结构。SMP是一种紧耦合、共享存储的系统模型,它的特点是多个CPU使用共同的系统总线,因此可访问共同的外设和存储器

2)中断.中断可以打断正在执行的进程(哪怕是在中断上下文),若中断处理程序对共享资源进程访问,则竞态也会发生.

3)内核抢占.2.6以后内核提供了内核可抢占特性,虽然是作为一个配置选项,但我们写程序时还是要考虑周全,故内核抢占也是作为伪并发的表现,也可能发生竞态;

临界区(critical section

   多个线程进程对共享资源进行访问在软件表现为一个程序片段,如何避免竞态的发生呢?一个执行路径在对共享资源进行访问时禁止其他执行路径进行访问,当有一个执行路径(A)对共享资源进行访问时,如有其他执行路径想访问共享资源,须睡眠等待A执行路径退出。那么这时这个程序片段就是临界区。那么具体如何来实现临界区呢?linux内核提供了多种同步互斥机制.(如信号量,互斥量,自旋锁,RCU,原子操作等).



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值