#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 100
typedef struct {
int number[N];
int choosing[N];
} lock;
void
Init(lock l)
{
int i;
for (i = 0; i < N; ++i)
{
l.choosing[i] = l.number[i] = 0;
}
}
int
Max(int* a, int length)
{
int i;
int max = a[0];
for (i = 1; i < length; ++i)
{
if (a[i] > max)
max = a[i];
}
return max;
}
void
Lock(lock l, int id)
{
l.choosing[id] = 1;
l.number[id] = Max(l.number, N) + 1;
l.choosing[id] = 0;
int j;
for (j = 0; j < N; j++)
{
if (j == id)
continue;
while (1)
{
if (l.choosing[j] == 0)
break;
}
while (1)
{
if (l.number[j] == 0)
break;
if ((l.number[j] > l.number[id])
|| (l.number[j] == l.number[id] && j > id))
break;
}
}
}
void
Unlock(lock l, int id)
{
l.number[id] = 0;
}
lock LOCK;
int counter;
void*
thread_code(void* data)
{
int id = (long) data;
int i;
for (i = 0; i < 10; ++i)
{
Lock(LOCK, id);
counter++;
Unlock(LOCK, id);
}
}
int
main(int argc, char* argv[])
{
counter = 0;
Init(LOCK);
pthread_t threads[N];
int i;
for (i = 0; i < N; i++) {
pthread_create(&threads[i], NULL, thread_code, (void *) i);
}
for (i = 0; i < N; i++) {
pthread_join(threads[i], NULL);
}
printf("Counter: %d\n", counter);
return 0;
}