Swap 指令
Swap
指令能原子地交换两个变量的值 ,即这一操作不可分割、不会被中断。其代码逻辑为:
boolean temp = *a;
:创建一个临时变量temp
,将变量a
的值暂存到temp
中 。*a = *b;
:把变量b
的值赋给变量a
。*b = temp;
:再把暂存在temp
中的值(原来a
的值 )赋给变量b
。通过这三步,实现了a
和b
两个变量值的交换 。
共享数据
boolean lock;
:这是一个共享的布尔型变量,初始化为false
,用于表示临界区是否被占用,类似一把锁,false
表示未上锁,临界区空闲 。boolean waiting[n];
:是一个布尔数组,不过在当前实现互斥的核心逻辑里,主要围绕lock
变量展开 ,这里n
表示进程数量相关 。
进程 Pi 执行逻辑
- 准备进入临界区:
key = true;
:进程Pi
先把局部变量key
设为true
。- 进入内层循环
do - while
,执行Swap(lock,key);
,将lock
和key
的值进行交换。如果交换前lock
为false
(临界区空闲 ) ,交换后key
就变为false
,循环条件(key != false)
不成立,进程可进入临界区;如果交换前lock
为true
(临界区已被占用 ) ,交换后key
为true
,进程就在循环里等待,不断执行Swap
操作检查lock
状态 。
- 进入临界区:当
key
变为false
,说明成功获得进入临界区的权限,进程Pi
进入临界区执行相关操作 。 - 离开临界区:
lock = false;
,进程Pi
执行完临界区操作后,将lock
设为false
,表示释放临界区,让其他进程有机会进入 。 - 执行剩余区:进程
Pi
进入剩余区执行非临界区代码 ,然后又回到外层循环开始处,不断重复这个过程 。
总体而言,通过Swap
指令原子交换变量值的特性,实现了多个进程对临界区的互斥访问 。