#include #include #include #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; }