我正在使用C语言进行并发编程的练习,在使用信号量时遇到了一些问题。 我在MacOSX上使用Xcode 6.3.2。
以下是一个似乎表现异常的示例程序:该示例的目的是打印ABCD或BACD字符串。
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <errno.h>
void *thread1(void*);
void *thread2(void*);
sem_t *sem0, *sem1, *sem2;;
int main(int argc, const char * argv[]) {
pthread_t t1, t2;
sem0 = sem_open("sem0", O_CREAT, 0600, 2);
sem1 = sem_open("sem1", O_CREAT, 0600, 0);
sem2 = sem_open("sem2", O_CREAT, 0600, 0);
// quick check
if (sem0 == SEM_FAILED || sem1 == SEM_FAILED || sem2 == SEM_FAILED) {
printf("Something went wrong\n");
return 0;
}
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_close(sem0);
sem_close(sem1);
sem_close(sem2);
return 0;
}
void *thread1(void* arg) {
int n=0;
while (n<10) {
sem_wait(sem0);
printf("A");
fflush(stdout);
sem_wait(sem1);
printf("C");
fflush(stdout);
sem_post(sem2);
n++;
}
pthread_exit(NULL);
}
void *thread2(void* arg) {
int n=0;
while (n<10) {
sem_wait(sem0);
printf("B");
fflush(stdout);
sem_post(sem1);
sem_wait(sem2);
printf("D\n");
fflush(stdout);
sem_post(sem0);
sem_post(sem0);
n++;
}
pthread_exit(NULL);
}
如果我正确地实现了信号量,那么结果应该是ABCD或BACD,但实际上我得到了各种奇怪的输出。以下是其中一部分输出:
ABCD
BAD
CABCD
BAD
CBAD
CBAD
CBAD
CBAD
CBAD
CBAD
C
有人能帮助我吗?提前感谢。
重要编辑:
我下载了Ubuntu,代码在那里运行非常顺畅,没有任何问题。所以,总结一下:
- MacOSX 10.10.3 with Xcode 6.3.2 --> 不能正常工作
- Ubuntu 15.04 --> 正常工作
不知道为什么。
void *
的参数,即使它们不使用它。实际上,你的编译器应该会警告指针类型不匹配。 - John Bollingersem_wait()
,尝试使用while (sem_wait(&sem) == -1 && errno == EINTR);
来确保没有任何东西在中断你的等待(出于某种原因)。 - Michael Burr