【发布时间】:2011-06-19 21:23:19
【问题描述】:
这是我正在处理的任务。它必须使用信号量,而不是互斥体。
#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", O_CREAT, 0700, 0);
ad=sem_open("foobar", O_CREAT, 0700, 0);
ce=sem_open("foobar", O_CREAT, 0700, 0);
de=sem_open("foobar", O_CREAT, 0700, 0);
ef=sem_open("foobar", O_CREAT, 0700, 0);
bf=sem_open("foobar", O_CREAT, 0700, 0);
/*sem_init(ab,0,1);
sem_init(ac,0,1);
sem_init(ad,0,1);
sem_init(ce,0,1);
sem_init(de,0,1);
sem_init(ef,0,1);
sem_init(bf,0,1);*/
assert(pthread_create(&_a, NULL, a, &r1) == 0);
assert(pthread_create(&_b, NULL, b, &r2) == 0);
assert(pthread_create(&_c, NULL, c, &r3) == 0);
assert(pthread_create(&_d, NULL, d, &r4) == 0);
assert(pthread_create(&_e, NULL, e, &r5) == 0);
assert(pthread_create(&_f, NULL, 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...
退出 A...
进入C...
进入 D...
退出 B...
退出 D...
退出 C...
进入电子...
进入F...
退出 F...
退出 E...
应该如下图:
对此的任何帮助将不胜感激,但这是一项任务,所以不要开始告诉我以完全不同的方式去做,也不要直接给出答案,只需指出正确的方向即可。
【问题讨论】:
-
您使用 SysV 信号量而不是 pthreads 互斥体的任何特殊原因?
-
@bdonlan:这些不是 SysV 信号量,它们是 POSIX 信号量,这是一个现代接口,可以很好地与 pthreads 配合使用。 SysV 信号量使用
semget()/semop()/semctl()。 -
我明白了。不过,为什么不使用互斥锁呢?
标签: c concurrency pthreads semaphore