互斥锁的实现

信号量(semaphore)是最在出现的用来解决线程同步与互斥问题的机制。

信号量s的概念包括一个称为信号量的变量及对它进行的两个原语操作。
信号量s的类型定义:
信号量s的数据结构为一个值和一个指针,指针指向等待该信号量的下一个线程。信号量s的值大于0时表示当前可用资源的数量;小于0时其绝对值表示等待使用该资源的线程数量。

信号量s是具有非负整数值的全局变量,只能由两种特殊的操作P和V来处理。
P(s):如果s是非零的,那么P将s减1,并且立即返回。如果s为零,那么就挂起这个线程,直到s变为非零,而一个V操作会重启这个线程。在重启之后,P操作将s减1,并将控制返回给调用者。其中P中的测试和减1操作是不可分割的。
V(s):V操作将s加1。如果有任何线程阻塞在P操作等待s变为非零,那么V操作其中一个线程,然后该线程将s减1,完成它的P操作。V中的加载、加1和存储信号量的操作也没有中断。

使用信号量来实现互斥锁基本思想是将每个共享变量与一个信号量(初始化为1)联系起来,然后用P/V操作将相应的临界区包围起来。这样s的值总是0或者1。在一个互斥锁上执行P操作对互斥锁加锁,执行V操作对互斥锁解锁。

P/V操作:

procedure p(var s:samephore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
procedure v(var s:samephore);
{
s.value=s.value+1;
if (s.value<=0) wakeup(s.queue);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值