Code:
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#include <semaphore.h>
#include <fcntl.h>
sem_t *ab, *ac, *ad, *bf, *ce, *de, *ef;
void *pa(void *arg) {
printf("thread A start\n");
sleep(1);
printf("thread A end\n");
assert( sem_post(ab)==0 );
assert( sem_post(ac)==0 );
assert( sem_post(ad)==0 );
pthread_exit((void *)99);
}
void *pb(void *arg) {
assert( sem_wait(ab)==0 );
printf("thread B start\n");
sleep(1);
printf("thread B end\n");
assert( sem_post(bf)==0 );
pthread_exit((void *)99);
}
void *pc(void *arg) {
assert( sem_wait(ac)==0 );
printf("thread C start\n");
sleep(1);
printf("thread C end\n");
assert( sem_post(ce)==0 );
pthread_exit((void *)99);
}
void *pd(void *arg) {
assert( sem_wait(ad)==0 );
printf("thread D start\n");
sleep(1);
printf("thread D end\n");
assert( sem_post(de)==0 );
pthread_exit((void *)99);
}
void *pe(void *arg) {
assert( sem_wait(ce)==0 );
assert( sem_wait(de)==0 );
printf("thread E start\n");
sleep(1);
printf("thread E end\n");
assert( sem_post(ef)==0 );
pthread_exit((void *)99);
}
void *pf(void *arg) {
assert( sem_wait(bf)==0 );
assert( sem_wait(ef)==0 );
printf("thread F start\n");
sleep(1);
printf("thread F end\n");
pthread_exit((void *)99);
}
int main() {
pthread_t a, b, c, d, e, f;
void *r;
ab=sem_open("semab", O_CREAT, 0700, 0);
ac=sem_open("semac", O_CREAT, 0700, 0);
ad=sem_open("semad", O_CREAT, 0700, 0);
bf=sem_open("sembf", O_CREAT, 0700, 0);
ce=sem_open("semce", O_CREAT, 0700, 0);
de=sem_open("semde", O_CREAT, 0700, 0);
ef=sem_open("semef", O_CREAT, 0700, 0);
/*sem_init(ab,0,0);
sem_init(ac,0,0);
sem_init(ad,0,0);
sem_init(bf,0,0);
sem_init(ce,0,0);
sem_init(de,0,0);
sem_init(ef,0,0);*/
assert(pthread_create(&a, NULL, pa, (void *)99) == 0);
assert(pthread_create(&b, NULL, pb, (void *)99) == 0);
assert(pthread_create(&c, NULL, pc, (void *)99) == 0);
assert(pthread_create(&d, NULL, pd, (void *)99) == 0);
assert(pthread_create(&e, NULL, pe, (void *)99) == 0);
assert(pthread_create(&f, NULL, pf, (void *)99) == 0);
assert(pthread_join(a, &r) == 0);
assert(pthread_join(b, &r) == 0);
assert(pthread_join(c, &r) == 0);
assert(pthread_join(d, &r) == 0);
assert(pthread_join(e, &r) == 0);
assert(pthread_join(f, &r) == 0);
assert( sem_close(ab)==0 );
assert( sem_close(ac)==0 );
assert( sem_close(ad)==0 );
assert( sem_close(bf)==0 );
assert( sem_close(ce)==0 );
assert( sem_close(de)==0 );
assert( sem_close(ef)==0 );
return 0;
}