1.Dekker
BOOLEAN flag[2] = { false };
int turn = 0;
void Lock(int id)
{
//dekker
flag[id] = 1;
while (flag[(id + 1) % 2])
{
if (turn == (id + 1) % 2)
{
flag[id] = 0;
while (turn == ((id + 1) % 2));
flag[id] = 1;
}
}
}
void unLock(int id)
{
/*实现方法二,Dekker或Peterson互斥算法*/
turn = (id+1)%2;
flag[id] = 0;
}
2.Peterson算法
BOOLEAN flag[2] = { false };
int turn = 0;
void Lock(int id)
{
//peterson
flag[id] = true;
turn = (id + 1) % 2;
while (flag[(id + 1) % 2] && turn == (id + 1) % 2);
}
void unLock(int id)
{
flag[id] = false;
}
3.Lamport算法
BOOLEAN choosing[g_totalThreads] = { false };
int num[g_totalThreads] = { 0 };
void Lock(int id)
{
choosing[id] = 1;
int m = 0;
for (int i = 0; i < g_totalThreads; i++)
if (num[i] > m)
m = num[i];
num[id] = m + 1;
choosing[id] = false;
for (int j = 0; j < g_totalThreads; j++)
{
while (choosing[j]);
while (num[j] != 0&&(num[j]<num[id]||(num[id]==num[j]&&(j<id))));
}
}
void unLock(int id)
{
num[id] = 0;
}
4.EM
enum k{idle,want_in,in_cs};
k flag[g_totalThreads] = { idle };
int turn = 0;
int j = 0;
void Lock(int id)
{
do
{
flag[id] = want_in;
j = turn;
while (j != id)
if (flag[j] != idle)
j = turn;
else
j = (j + 1) % g_totalThreads;
flag[id] = in_cs;
j = 0;
while ((j < g_totalThreads) && (j == id || flag[j] != in_cs))
j++;
} while (j != g_totalThreads);
turn = id;
}
void unLock(int id)
{
j = (turn + 1) % g_totalThreads;
while (flag[j] == idle)
j = (j + 1) % g_totalThreads;
turn = j;
flag[id] = idle;
}