线程间同步的方式有哪些?

Linux 系统提供了五种用于线程间同步的方式:互斥锁、读写锁、自旋锁、信号量、条件变量

互斥锁

主要用于保护共享数据,确保同一时间内只有一个线程访问数据。

互斥量本质上来说就是一把锁,在访问共享资源前对互斥量进行加锁,访问完成后对释放互斥量,也就是解锁。

对互斥量进行加锁之后,任何其试图再次对互斥量加锁的线程都会被阻塞知道当前线程释放该互斥锁。

这样就能保证每次只有一个线程可以向前执行了。

在这里插入图片描述

读写锁

读写锁也叫做 共享互斥锁

他有三种状态:

读模式下加锁状态、写模式下加锁状态、不加锁状态。

一次只能有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。

因此与互斥量相比,读写锁允许更高的并行性。

读写锁非常适合对数据结构读的次数远大于写的情况。

在这里插入图片描述

自旋锁

自旋锁是一种忙等待锁,不是通过休眠使进程阻塞的,而是在获取锁之前一直处于忙等待(自旋)的阻塞状态。

自旋锁可用于以下情况:

锁被持有的时间短,而且线程并不希望在重新调度上花费太多的成本。

自旋锁用在非抢占式内核中时是非常有用的,除了提供互斥机制以外,还可以阻塞中断,这样中断处理程序就不会陷入死锁状态

在这里插入图片描述

信号量

线程的信号量和进程的信号量类似,使用线程的信号量可以高效地完成基于线程的资源计数。

信号量实际上是一个非负的整数计数器,用来实现对公共资源的控制。在访问前进行申请资源(P 操作)和在访问结束后进行释放资源(V 操作),以确保资源的正确使用

在公共资源增加的时候,信号量就增加;公共资源减少的时候,信号量就减少,只有当信号量大于 0 的时候,才能访问信号量所代表的公共资源。

在这里插入图片描述

条件变量

条件变量是线程可用的另一种同步机制。

条件变量给多个线程提供了一个会和的场所。

条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生,条件变量本身由互斥量保护。

线程在改变条件状态之前必须首先锁住互斥量。

其他线程在获得互斥量之前不会察觉到这种改变,因此互斥量必须在锁住以后才能计算条件。

总结

Linux 系统提供了五种用于线程间同步的方式:

互斥锁、读写锁、信号量、自旋锁、条件变量

  • 互斥锁:用于保护共享变量,确保同一时间只有一个线程可以访问该资源,只有获得互斥锁的线程才能进入临界区,其他线程需要等待锁的释放
  • 读写锁:也称为 共享-独占锁,允许多个线程同时读取共享资源,但在写操作时需要独占访问,读写锁在读多写少的场景中可以提供更好的并发性能
  • 信号量:用于控制对一组资源的访问。信号量允许多个线程同时访问资源,但是需要在访问前进行申请资源(P 操作)和在访问结束后进行释放资源(V 操作),以确保资源的正确使用
  • 自旋锁:是一种忙等待锁,在获取锁之前,线程会一直尝试获取锁,而不会进入睡眠状态。自旋锁适用于锁占用时间短暂、保护临界区较小的情况
  • 条件变量:用于在线程之间进行条件同步。一个线程可以等待某个条件满足,而另一个线程在满足条件时可以通知等待线程继续执行
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程同步是指多个线程按照一定的顺序执行,以避免对共享资源的并发访问导致的数据不一致或者死锁等问题。下面是线程同步方式及其作用: 1. 互斥锁(Mutex):互斥锁是最常用的同步方式之一,它保证了同一时只有一个线程可以访问共享资源。当一个线程获得互斥锁后,其它线程的访问请求会被阻塞,直到该线程释放锁。互斥锁的作用是避免多个线程同时访问同一个共享资源,从而保证数据的一致性。 2. 信号量(Semaphore):信号量是一种计数器,它用来控制多个线程对共享资源的访问。当多个线程同时访问共享资源时,每个线程会首先尝试获取信号量,如果信号量的计数器大于0,则表示可以访问共享资源,同时将计数器减1;如果计数器为0,则表示共享资源已经被其它线程占用,当前线程需要等待其它线程释放资源后才能获取信号量。信号量的作用是控制多个线程对共享资源的访问顺序,以避免数据不一致或者死锁等问题。 3. 条件变量(Condition Variable):条件变量是一种高级同步机制,它允许线程在满足特定条件之前等待。当一个线程发现某个条件不满足时,它可以等待条件变量,而不是忙等待或者轮询等待。当其它线程修改了共享资源并满足了条件时,它可以通过条件变量唤醒等待的线程。条件变量的作用是避免线程的忙等待,提高程序的效率。 4. 屏障(Barrier):屏障是一种同步机制,它允许多个线程在某个点上等待,直到所有线程都到达该点后再继续执行。屏障的作用是协调多个线程的执行顺序,以避免数据不一致或者死锁等问题。 以上几种同步方式都是为了避免多个线程访问共享资源时出现问题,从而保证程序的正确性和可靠性。每种同步方式都有自己的适用场景和优缺点,需要根据具体情况选择合适的同步方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值