线程间同步
同步和通信的区别
线程间同步用于控制多个线程按照一定的顺序访问资源。
线程间通信用于进程间传输信息,线程同步是一种进程通信的表现形式,通过修改信号量,线程之间可相互协调运行和协同工作。
线程间同步机制
线程间同步有互斥量、信号量、管程等几种方式,在介绍线程间同步之前,首先要介绍一下临界区的概念:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段。在任意时刻只允许一个线程对临界区进行访问,如果有多个线程试图访问临界区,那么在有一个线程进入后,其他试图访问临界区的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。临界区只能用于在同一进程里线程间的互斥访问。
互斥量
只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥量比临界区复杂,互斥量不仅仅能够在同一进程的不同线程间实现资源的安全共享,而且可以在不同进程的线程间实现对资源的安全共享。
信号量
信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,但是需要限制在同一时刻访问此资源的最大线程数目。这与操作系统中的PV操作相同。
- P操作:使信号量减1,若信号量大于等于0,则该进程继续执行,否则排入等待队列。
- V操作:使信号量加1,若信号量大于0 ,唤醒等待队列中的一个进程。
锁(互斥量)和信号量的区别
- 互斥量用于线程的互斥,互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性,但互斥无法限制访问者对资源的访问顺序,即访问是无序的。信号量用于线程的同步,大多数情况下,同步是指在互斥的基础上通过其它机制实现访问者对资源的有序访问,少数情况下同步是指可以允许多个访问者同时访问资源。
- 互斥量值只能为0/1,信号量值可以为非负整数。一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资