说实话, 这章没有完全看懂
我们进入信号区可以如果是读操作, 那么就可以允许它几个信号同时进行, 如果是写操作 ,那么就设置只能是一个信号进行。
P 和 V 都是两个科学家的名简称, 他们是提出这个概念的人。
信号量是整数
信号量是被保护的变量
P()能够阻塞,V()不会阻塞
我们假定信号量是公平的
两个类型信号量
信号量可以用在2个方面
condition = new Semaphore(0);
//Thread A
...
condition->P(); //等待线程B某一些指令完成之后再继续运行,在此阻塞
...
//Thread B
...
condition->V(); //信号量增加唤醒线程A
...
class BoundedBuffer{
mutex = new Semaphore(1);
fullBuffers = new Semaphore(0); //说明缓冲区初始为空
emptyBuffers = new Semaphore(n); //同时可以有n个生产者来生产
};
BoundedBuffer::Deposit(c){
emptyBuffers->P();
mutex->P();
Add c to the buffer;
mutex->V();
fullBuffers->V();
}
BoundedBuffer::Remove(c){
fullBuffers->P();
mutex->P();
Remove c from buffer;
mutex->V();
emptyBuffers->V();
}
使用硬件原语 :
类似锁
class Semaphore{
int sem;
WaitQueue q;
};
//p操作的实现
Semaphore::P(){
--sem;
if(sem < 0){
Add this thread t to q;
block(p);
}
};
//V操作的实现
Semaphore::V(){
++sem;
if(sem <= 0){
Remove a thread t from q;
wakeup(t);
}
}
缺点:
管程就可以解决上述信号量的缺点
目的: 分离互斥和条件同步的关注
定义 :
是包含了一系列的共享变量及其争对这些变量的操作的函数的一个组合(模块)
大致结构图: