临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性
锁的特性
只有有限的人能占有,关键结构、数据、区域只有特定的对象能访问,为了解决并发操作的顺序不确定性。
锁的种类
互斥锁
对于读者和写者来说。只要有一方获取了锁,另一方则不能继续获取,进而执行临界区代码
自旋锁
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
因为这个资源非常重要,所以一直在远大转圈等这个资源,别的什么事也不干。
保障了不同CPU对一段关键代码同时只能有一方占用,而且这个资源非常重要,所以一定要等到这个资源,不会被调度和中断,一直等,常常用在中断里面。
特点:
轮询忙等待,在单核cpu下不起作用:被自旋锁保护的临界区代码执行时不能进行挂起状态。会造成死锁
读写锁
读写锁适合于对数据结构的读次数比写次数多得多的情况.因为,读模式锁定时可以共享,以写 模式锁住时意味着独占,所以读写锁又叫共享-独占锁.
条件变量
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直 到某特殊情况发生为止。通常条件变量和互斥锁同时使用。
信号量和锁的差别
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”
也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务 并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进 行操作。在有些情况下两者可以互换。