範例1:算法
boolean choosing[n];表示進程是否在取號數據結構
int number[n];記錄每一個進程取到的號碼框架
這些數據結構分別初始化爲false和0,爲了方便,定義以下符號:線程
若a<c或a==c和b<d同時成立,(a,b)<(c,d)進程
do
{
choosing[i] = true;
number[i] = max{number[0],number[1],…,number[n-1]}+1;//選號碼
choosing[i] = false;
for(j = 0; j<n; j++)
{
while (choosing[j]);
while ((number[j] != 0) && (number[j],j)<(number[i],i));
};內存
//臨界區
number[i] = 0;
//其他部分
}while(1);
理解:get
第一個試圖進入臨界區的進程Pi在沒有其它進程競爭時順利進入其臨界區。知足了有空就進的要求。it
當有競爭者Pk(i<k),且選的號碼相同時,比較進程的名稱,經過語句while ((number[j] != 0) && (number[j],j)<(number[i],i));來選擇進入的進程。io
在Pi進程中j==i時,number[j]==number[i],且j==i因此(number[j],j)<(number[i],i)不成立,退出while語句。j==k時,number[k]==number[i],且k>i因此(number[j],j)<(number[i],i))不成立,退出while語句。對與其它非i和k的j值,number[j]!=0不成立,退出while語句。thread
在pk進程中j==i時,number[j]<number[k],且j<k,因此(number[j],j)<(number[i],i))成立,故進程Pk陷在該語句中,直到Pi退出臨界區執行語句number[i]==0時才容許Pk進程進入其臨界區。因此知足了互斥和有限等待的要求。
範例2:
在計算機文獻中的幾種互斥算法中,所謂的Lamport麪包店算法能夠有效地用於多個相互競爭的控制線程,該算法中線程之間的通訊只能在共享內存中進行(即,不須要諸如信號量、原子性的set-and-test之類的專門機制)。該算法的基本思想源於麪包店,由於麪包店須要先取號而後等候叫號。下面給出了該算法的框架,該算法能夠使各線程進出臨界區而不產生衝突。
Enter, Number: array [1..N] of integer = {0};
// logic used by each thread
// where "(a, b) < (c, d)"
// means "(a < c) or ((a == c) and (b < d))"
Thread(i) {
while (true) {
Enter [i] = 1;
Number[i] = 1 + max(Number[1],,Number[N]);
Enter [i] = 0;
for (j=1; j<=N; ++j) {
while (Enter[j] != 0) {
// wait until thread j receives its number
}
while ((Number[j]!=0)
&& ((Number[j],j) < (Number[i],i))) {
// wait until threads with smaller numbers
// or with the same number, but with higher
// priority, finish their work
}
}
// critical section
Number[i] = 0;
// non-critical section
}
}