临界区

临界区是指一个访问共享资源(如变量、数据结构、文件等)的程序片段,在这个片段中,多个进程或线程不能同时执行,否则可能会导致数据不一致或竞态条件。

具体来说,临界区有四个特点。

第一个是互斥性,即同一时间只能有一个进程或线程进入临界区,其他进程或线程必须等待;

第二个是有限等待,进程或线程在有限时间内能够进入临界区,不会无限期等待;

第三个是让权等待,即如果进程或线程不能立即进入临界区,它应该释放CPU,让其他进程或线程运行。

第三个是空闲让进,即如果没有进程或线程在临界区中执行,那么请求进入临界区的进程或线程应该被允许进入。

和临界区这个概念紧密联系的就是并发编程了,比如说可以站在并发编程的角度重新看这四个特性。

互斥性其实不是必须满足的特性。比如说读写锁就没有严格遵循互斥性,读锁本身是允许多个线程加锁的。

而有限等待更多体现为超时控制。最为典型的例子就是在使用并发队列的时候,入队出队都可以增加超时控制,如果要是在时限内都没有操作成功,则返回错误。

让权等待则是体现为如果要是没有拿到锁之类的,就会阻塞,从而让出了 CPU。当然有一些场景下为了优化性能,会引入自旋机制,看看能不能在自旋的时候就获得锁,或者操作成功。

空闲让进则意味着线程或者协程的调度机制,必须要在锁让出的时候,唤醒阻塞的线程或者协程,进一步执行。