do{
waiting[i] = true // 表示進程Pi處於等待獲取鎖的狀態
key = true;
while(waiting[i]&&key)
key=TestAndSet(&lock); // 如果進程Pi搶到了鎖,記錄key=false
waiting[i]=false;
critical section
j=(i+1)%n;
while(j!=i && !waiting[j]) // 進程Pi處於等待獲取鎖的狀態
j = (j+1)%n;
if(j==i)
lock = false;
else
waiting[j] = false;
remainder section
}while(1);
解釋:
臨界區條件1:互斥
第一個進入的進程Pi要等執行了
TestAndSet之後才能進入,這時
Pi的key=false,其他進程key=true;
後續進入的進程Pi,只有在其他
進程將waiting[i]設爲false之後,才
可能進入
臨界區條件2:空閒讓進
初始,key和所有的waiting[i]都爲
True,lock=false,因此首次執行
TestAndSet的進程會進入臨界區
當進入臨界區的進程Pi執行完
臨界區操作之後,在退出區,通過
While循環掃描當前處於等待狀態的
進程j (j!=i),
-如果找到j,那麼waiting[j]被設爲false,
Pj會隨後進入臨界區
-如果沒有找到j,那麼lock被置爲false
總之,只要臨界區資源空閒,想進入
臨界區的進程(其waiting[j]=true)都
會被放進臨界區
臨界區條件3:有限等待
每個進程退出臨界區的時候,
總會按順序執行一個掃描,
這個循環掃描的過程保證一個進程
最多等待n-1次即可進入臨界區操作