线程同步的方式有哪些?
线程同步是发生在多线程环境下的一种保证线程能够正确访问共享资源的一种现象。线程同步可以保证因线程并发导致的共享数据不一致问题。简单来说,就是让线程可以按照一定逻辑顺序执行。
线程同步的方式:
- 互斥锁:互斥锁是保证线程同步最常见的方式。当线程访问共享资源时就会加上互斥锁,线程停止对共享资源的操作才会释放锁。在其他线程访问加锁的共享资源就会被操作系统内核将其置为睡眠态,把他的cpu资源调度给其他线程使用,只有该锁释放的时候,才会将该线程从睡眠态转变为就绪状态,那这个也涉及到了内核态和用户态之间的上下文切换会带来额外开销
- 自旋锁,自旋锁和互斥锁都属于操作系统中最基本的锁,也都是悲观锁,不一样的是当一个线程遇到加了自旋锁的共享资源时会继续占有cpu并且进入等待状态,直到需要使用的共享资源被释放。自旋锁比较适用于临界区执行时间很短,这样不用互斥锁就可以避免大量的上下文切换开销。但是缺点就是如果锁等待时间长,线程会空转占用cpu时间。
- 读写锁:读写锁分为读锁和写锁两种模式,在读锁模式下是共享锁可以允许多个线程持有读锁,写模式是独占锁只允许一个线程拥有。读写锁在读多写少的场景下能够显著提高性能。
- 条件变量:条件变量是在线程使用共享资源之前要满足特定的条件。满足之前线程需要进行等待
- 信号量:信号量是一种计数器用于控制多线程对共享资源的访问,用PV操作来控制资源的申请和释放。信号量比较适合可以灵活的管理多个资源的访问。不过编程复杂容易死锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Priska's blog!