进程同步

协调多个进程之间的执行顺序,确保他们在特定时刻能够按照特定顺序访问共享资源。也就是并发进程在一些关键点上可能相互等待与互通消息,这种相互制约的等待与互通消息成为进程/线程同步
保持进程之间的执行次序,确保多个进程能够按照预期的逻辑顺序执行。比如生产者消费者模型,必须生产者生产数据后才能消费。

进程互斥

进程互斥是指在同一时刻只能有一个进程对共享资源进行访问,其他进程在访问之前必须等待,直到当前进程释放资源。
避免多个进程同时对共享资源进行操作,导致数据不一致。互斥保证同一时间只有一个进程能够访问共享资源。

多线程执行操作共享变量的这段代码可能会导致竞争状态,因此将该代码区称为临界区,是访问共享资源的代码片段,不能给多线程同时执行。
临界区的代码应该是互斥的,保证一个线程在临界区执行时,其他线程应该被阻止进入临界区。

互斥锁

互斥锁是一种保护临界区的同步工具。只有获得互斥锁的进程才能进入临界区访问共享资源。

  • 进程进入临界区之前,需要获取临界锁,如果锁已经被其他进程拥有,当前进程就会被阻塞。直到锁被释放。
  • 进程访问结束后,进程释放互斥锁,其他阻塞的进程就可以继续获取锁

2.3 条件变量(Condition Variable)

  • 定义
    • 条件变量是一种用于同步线程的工具,它通常与互斥锁结合使用,使线程能够在某个条件满足时继续执行。
  • 工作原理
    • 当某些共享资源的状态不满足条件时,线程可以通过条件变量等待。当某个线程改变了共享资源的状态,并且条件满足时,它会通知等待的线程继续执行。
  • 适用场景
    • 适用于需要等待某一条件成立时才继续执行的场景,如消费者等待生产者生产数据的情况。

信号量

信号量可以用于同步进程和控制资源访问的一种计数器。信号量sem表示资源的数量。通过两个原子操作PV用来实现对资源的申请和释放

  • P操作:sem = sem-1sem < 0 就让线程进入阻塞等待。
  • V操作:sem = sem + 1 sem<=0就唤醒一个等待中的进程