Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement