Linux并发与竞争
锁类型 | 优点 | 缺点/使用注意 | 适用场景 |
---|---|---|---|
自旋锁 | 忙等待,响应性快 | 忙等待浪费处理器时间,降低系统性能 | 短时期的轻量级加锁 |
读写自旋锁 | 允许多个线程持有读锁。 只允许一个线程持有写锁,并且此线程不允许读操作。 | 一次只允许一个写操作,也就是只能有一个线程持有写锁。 | 有多个线程需要读取共享资源,但是只有一个线程需要写共享资源的情景。 |
顺序锁 | 顺序锁由读写锁衍生而来,顺序锁可以在写时进行读写,实现同时读写。 | 如果在写时发生了读操作,需要重新读取数据。 | 同时需要读写的数据。 |
信号量 | 可以使得线程进入休眠状态,可以提高处理器的使用效率。 | 1:信号量不适于中断中,因为信号量会引起线程休眠。 2:信号量会导致线程休眠,休眠则对应着一定会存在唤醒,则会带来系统开销。 | 1:因为信号量可以使等待资源线程进入休眠状态,因此适用于那些占用资源比较久的场合。 2:如果共享资源持有时间较短,则不适合使用信号量,因为频繁的休眠,唤醒会加大系统的开销,并且开销远大于信号量带来的优势。 |
互斥体 | 保护共享资源,一次只有一个线程能访问共享资源。 | 1:mutex可以导致休眠,因此不能在中断中使用mutex,中断中只能使用自旋锁 2:mutex不能递归上锁和解锁 | 1:占用资源时间比较久的场合 |
PS:
- 将信号量的值设为1就可以实现互斥体。