58 lines
1.1 KiB
C
58 lines
1.1 KiB
C
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <pthread.h>
|
|
#include <semaphore.h>
|
|
|
|
sem_t *sems[6];
|
|
|
|
typedef struct params {
|
|
int sPrev;
|
|
int sNext;
|
|
int nPrev;
|
|
int nNext;
|
|
char * name;
|
|
} *params_t;
|
|
|
|
void* t_code(void * arg) {
|
|
params_t p = (params_t) arg;
|
|
while (1) {
|
|
for (int i = 0; i < p->nPrev; i++) sem_wait(sems[p->sPrev]);
|
|
puts(p->name);
|
|
sleep(3);
|
|
for (int i = 0; i < p->nNext; i++) sem_post(sems[p->sNext]);
|
|
}
|
|
free(p);
|
|
}
|
|
|
|
pthread_t* start_t(int sPrev, int sNext, int nPrev, int nNext, char * name) {
|
|
pthread_t *t;
|
|
params_t p = malloc(sizeof(struct params));
|
|
p->sPrev = sPrev;
|
|
p->sNext = sNext;
|
|
p->nPrev = nPrev;
|
|
p->nNext = nNext;
|
|
p->name = name;
|
|
pthread_create(t, NULL, t_code, (void *) p);
|
|
return t;
|
|
}
|
|
|
|
int main() {
|
|
for (int i = 0; i < 6; i++) {
|
|
sems[i] = malloc(sizeof(sem_t));
|
|
sem_init(sems[i], 0, 0);
|
|
}
|
|
sem_post(sems[0]);
|
|
start_t(0, 1, 1, 3, "A");
|
|
start_t(1, 2, 1, 1, "B");
|
|
start_t(1, 3, 1, 2, "C");
|
|
start_t(1, 4, 1, 1, "D");
|
|
start_t(3, 5, 1, 1, "E");
|
|
start_t(3, 5, 1, 1, "F");
|
|
start_t(5, 2, 1, 1, "G");
|
|
start_t(4, 2, 1, 1, "H");
|
|
start_t(2, 0, 3, 1, "I");
|
|
|
|
sleep(24);
|
|
}
|