互斥锁
互斥锁加锁失败时,线程会释放CPU给其他线程。
互斥锁是一种独占锁,当线程A加锁成功后此时互斥锁已经被线程A独占了,其他的线程枷锁就会失败。当线程枷锁失败后内核会将线程设为阻塞状态,锁被释放后内核会在合适的时机唤醒线程。互斥锁加锁失败会产生开销,两个进程的上下文切换。
自旋锁
自旋锁加锁失败后线程会进入忙等,直到它拿到锁。自旋锁开销小一般不会产生线程上线文切换。需要注意的是如果是单核CPU需要抢占式调度器,因为忙等进程不会放弃CPU。
读写锁
只读取公共资源用读锁加锁,要修改公共资源用写锁加锁。
当读锁被线程持有时,多个线程能够并发地持有读锁,但是当写锁被线程持有后读进程获取读锁会被阻塞,其他写进程获取写锁也会被阻塞。
悲观锁和乐观锁
上述锁都是悲观锁,悲观锁认为修改资源的概率高容易出现冲突,所以在访问资源前先上锁。
乐观锁比较乐观,认为多线程同时修改进程发生冲突概率较低。工作方式是先修改资源,再验证这段时间有没有冲突,如果没有其他进程修改资源操作完成,否则放弃本次操作。所以也叫无锁编程。
操作系统锁机制-1
最新推荐文章于 2023-05-18 10:53:49 发布