这是我正在进行的任务.它必须使用信号量,而不是互斥量.
#include <stdio.h> #include <pthread.h> #include <assert.h> #include <unistd.h> #include <semaphore.h> #include <fcntl.h> sem_t *ab,*ac,*ad,*de,*ce,*bf,*ef; void *a(void *arg) { printf("Entering A...\n"); sleep(1); printf("Exiting A...\n"); assert(sem_post(ab)==0); assert(sem_post(ac)==0); assert(sem_post(ad)==0); pthread_exit((void *)99); } void *b(void *arg) { assert(sem_wait(ab)==0); printf("Entering B...\n"); sleep(1); printf("Exiting B...\n"); assert(sem_post(bf)==0); pthread_exit((void *)99); } void *c(void *arg) { assert(sem_wait(ac)==0); printf("Entering C...\n"); sleep(1); printf("Exiting C...\n"); assert(sem_post(ce)==0); pthread_exit((void *)99); } void *d(void *arg) { assert(sem_wait(ad)==0); printf("Entering D...\n"); sleep(1); printf("Exiting D...\n"); assert(sem_post(de)==0); pthread_exit((void *)99); } void *e(void *arg) { assert(sem_wait(ce)==0); assert(sem_wait(de)==0); printf("Entering E...\n"); sleep(1); printf("Exiting E...\n"); assert(sem_post(ef)==0); pthread_exit((void *)99); } void *f(void *arg) { assert(sem_wait(bf)==0); assert(sem_wait(ef)==0); printf("Entering F...\n"); sleep(1); printf("Exiting F...\n"); pthread_exit((void *)99); } int main() { pthread_t _a,_b,_c,_d,_e,_f; int r1,r2,r3,r4,r5,r6; ab=sem_open("foobar",O_CREAT,0700,0); ac=sem_open("foobar",0); ad=sem_open("foobar",0); ce=sem_open("foobar",0); de=sem_open("foobar",0); ef=sem_open("foobar",0); bf=sem_open("foobar",0); /*sem_init(ab,1); sem_init(ac,1); sem_init(ad,1); sem_init(ce,1); sem_init(de,1); sem_init(ef,1); sem_init(bf,1);*/ assert(pthread_create(&_a,NULL,a,&r1) == 0); assert(pthread_create(&_b,b,&r2) == 0); assert(pthread_create(&_c,c,&r3) == 0); assert(pthread_create(&_d,d,&r4) == 0); assert(pthread_create(&_e,e,&r5) == 0); assert(pthread_create(&_f,f,&r6) == 0); assert(pthread_join(_a,NULL) == 0); assert(pthread_join(_b,NULL) == 0); assert(pthread_join(_c,NULL) == 0); assert(pthread_join(_d,NULL) == 0); assert(pthread_join(_e,NULL) == 0); assert(pthread_join(_f,NULL) == 0); assert( sem_close(ab)==0 ); assert( sem_close(ac)==0 ); assert( sem_close(ad)==0 ); assert( sem_close(ce)==0 ); assert( sem_close(de)==0 ); assert( sem_close(bf)==0 ); assert( sem_close(ef)==0 ); return 0; }
这很简单,但由于某种原因,它没有以正确的顺序执行.输出远非一致但总是不正确.这是一个示例输出:
进入A ……
输入B …< ---- sem_post(ab)甚至还没有被调用
退出A …
进入C ……
进入D ……
退出B …
退出D …
退出C …
进入E ……
输入F …
退出F …
退出E …
它应该遵循以下图表:
任何有关这方面的帮助将不胜感激,但这是一项任务,所以不要开始告诉我以完全不同的方式做到这一点并且不要直接给出答案,只需指出正确的方向.