4月11日作业修订
A.这主要看你互斥锁锁的资源是那部分的,如果是进程内资源,则可以实现同一进程不同线程之间的互斥,而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。
B.这是必然的,加锁是为了防止数据的二义性
C.信号量同时使用的是共享资源的不同部分,因而不会导致数据的二义性
D.速度快,但是只能用于同一线程的进程之间
BC:条件变量和信号量都可以实现进程间的通知和唤醒,这是线程间同步实现的基础
AD:互斥锁和读写锁都是为了实现对共享安全访问操作的锁的技术,并不含有通知和唤醒的功能
条件变量提供了一个pcb队列以及阻塞和唤醒的接口实现同步,但是什么时候唤醒以及什么时候阻塞线程是由程序员控制的,而这个控制是需要一个共享资源来决定的,所以需要搭配上一个互斥锁来进行使用来保护这个共享资源的条件判断和操作
信号量提供一个pcb等待队列以及一个实现了原子操作的计数器,通过计数器来实现同步的条件判断,所以不需要这个互斥锁,原子操作本生就能避免这个数据二义性问题。
条件变量进行同步的判断条件是这个共享资源本省,所以需要搭配互斥锁进行使用
条件变量被唤醒时,需要重新进行条件判断,因为有的线程卡在锁的地方,一个线程结束后,直接进入还是会导致数据的二意
需要两个条件变量,因为如果出现误唤醒的情况,两个对象,两个条件变量,分开唤醒