线程同步、通讯的方式有哪些?

线程同步

  1. 互斥量(互斥锁/mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。互斥对象和临界区(代码的一个区间)对象非常相似,只是其允许在进程间使用,而临界区只限制于同一进程的各个线程之间使用,但是更节省资源,更有效率。
  2. 信号量/semaphore:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。Mutex互斥量可以说是semaphore在仅取值0/1时的特例
  3. 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。
  4. 临界区(CCriticalSection)(已被舍弃)当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。具体应用方式:

        1、 定义临界区对象CcriticalSection g_CriticalSection;

        2、 在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock();

        3、 访问共享资源后,则放弃临界区对象,g_CriticalSection.Unlock();

 

线程通讯

        由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核的调度)。

        线程间的通信目的主要是用于线程同步。所以线程没有像进程通信中的用于数据交换的通信机制。也就是说,线程的通讯与线程的同步一样

1.(互斥)锁机制

        包括互斥锁、条件变量、读写锁;

        互斥锁提供了以排他方式防止数据结构被并发修改的方法。

        条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

        读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

 

2.信号量机制(Semaphore)

        包括无名线程信号量和命名线程信号量

 

3.信号机制(Signal)

        类似进程间的信号处理

猜你喜欢

转载自blog.csdn.net/qq_35642036/article/details/82801151