并发锁
发布日期:2021-05-08 05:54:33 浏览次数:24 分类:精选文章

本文共 1203 字,大约阅读时间需要 4 分钟。

1. 互斥锁

互斥锁通过睡眠状态确保进程间的互斥。获取锁失败时,进程会进入睡眠态,等待内核调度重新唤醒。这种机制会导致线程切换,带有一定的开销。

特点:获取锁失败会陷入睡眠,适用于互斥代码执行时间较长。

1.1 pthread_mutex_lock

使用 `pthread_mutex_lock` 获取锁时,进入互斥区间内执行操作。 ```c pthread_mutex_lock(&mxlock); ++val; pthread_mutex_unlock(&mxlock); ```

1.2 pthread_mutex_trylock

`pthread_mutex_trylock` 不会阻塞,适用于自旋锁或互斥锁。 ```c pthread_mutex_trylock(&mxlock); while (pthread_mutex_trylock(&mxlock) != 0) { printf("pthread_mutex_trylock fail thread:%d\n", pthread_self()); } ++val; printf("i=%d\n", val); pthread_mutex_unlock(&mxlock); ```

2. 自旋锁

自旋锁通过忙等待(busy waiting)实现加锁,使用 CAS 原子操作不断尝试获取锁,直到成功。不会导致线程切换。 ```c pthread_spin_lock(&spinlock); ++val; pthread_spin_unlock(&spinlock); ``` 特点:一直占用 CPU,适用于互斥代码执行时间较短。

3. 读写锁

读写锁允许多个线程同时读取,但写入时互斥。获取锁失败时进入睡眠状态。

特点:保证读并发,写互斥。获取锁失败进入睡眠。

3.1 读优先

读优先锁允许读线程优先获取锁,写线程可能因饥饿问题而长时间等待。

可能导致写线程饥饿,一直有读请求到来,导致写获取不到锁。

3.2 写优先

写优先锁允许写线程优先获取锁,读线程可能因饥饿问题而长时间等待。

可能造成读饥饿,读线程长时间无法获取锁。

3.3 公平锁

通过队列机制,按顺序处理读写请求,避免了饥饿问题。

特点:读写操作入队列,按顺序获取锁,解决了饥饿问题。

4. 悲观锁

悲观锁假设共享资源的访问会导致冲突,在访问前必须加锁。包括互斥锁、自旋锁、读写锁等。

特点:在多线程下,共享资源容易发生冲突。

5. 乐观锁

乐观锁假设共享资源的冲突概率较低,先修改资源再验证冲突。适用于冲突概率小的场景。

特点:多线程下,共享资源很少发生冲突,先修改后验证。虽然无锁,但增加了重试成本。

6. CAS

CAS(Compare-and-Swap)是通过硬件指令实现的原子操作,用于实现自旋锁和其他互斥机制。

特点:通过 CPU 硬件指令实现互斥资源的原子操作。

上一篇:函数调用栈
下一篇:中断 系统调用

发表评论

最新留言

不错!
[***.144.177.141]2025年04月03日 10时23分52秒