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