gpt4 book ai didi

C信号量奇怪的优先行为

转载 作者:行者123 更新时间:2023-12-01 13:52:07 24 4
gpt4 key购买 nike

我正在练习 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,代码在那里运行顺利,完全没有问题。所以,继续

  • 带有 Xcode 6.3.2 的 MacOSX 10.10.3 --> 无法正常工作
  • Ubuntu 15.04 --> 正常运行

不知道为什么。

最佳答案

您的问题可能是 printf 输出被缓冲并在线程之间共享。在信号量上发布之前,您必须确保使用 fflush 清空缓冲区。

关于C信号量奇怪的优先行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com