《编译、链接与装载》笔记(2)锁,互斥量,原子操作

发布于 2021-09-07  46 次阅读


由于线程之间可以共享数据,这会导致,线程同步安全

一种可行方法为,将风险操作分割为多个线程安全的原子操作,原子操作在一条指令中执行,不会被打断

Windows提供了多种原子操作API,不列举了,需要的时候查查就行

但是一些较复杂的操作,难以分割为线程安全的原子操作,这时就需要锁

正文

线程同步的思想是避免多个线程同时读取相同数据区域,其他线程需要等待当前读取的线程,将数据访问这一操作原子化(无视访问的数据量的大小以及所需时长而达成了原子化)

锁是非强制的,线程访问数据时会先尝试获取锁,并在结束后释放锁

二元信号量是最简单的锁,多元信号量简称信号量

二元信号量只有0和1两种可能

多元信号量有0到X共X+1种可能,支持多线程访问

当一个线程访问资源时,信号量减一,当为0时,拒绝访问,释放信号量时,信号量加一

信号量可以由任意线程上锁,由任意线程解锁

但是互斥量只能由locker解锁

临界区是更为严格的同步手段,临界区加锁称为进入,解锁称为离开

对于前面的情况,在锁定时,操作系统中的任何进程尝试获取锁的行为是完全合法的,尽管结果必然是失败的

但是尝试进入临界区这一行为本身就是非法的

读写锁可以选择锁的性质:独占的还是共享的,具体情况表格懒得列了,有需求的时候回补