c - 我是线程和信号量的新手,我似乎可以理解为什么我的代码不起作用,任何帮助将不胜感激
问题描述
我正在尝试编写一个使用信号量打印 <one><two><three> 的代码,但该代码无法运行,而且我找不到我的错误。
我也试过pthread_join
,但它是一样的:无论如何它都不会打印。
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
sem_t f1, f2, f3;
int done = 1;
void *threadfunc(void *n) {
int a = 0;
while (1) {
if ((int)*(int *)n == 1) {
//printf("1st THREAD!\n");
printf("<ONE>");
sem_wait(&f1);
} else if ((int)*(int *)n == 2) {
//printf("2st THREAD!\n");
printf("<TWO>");
sem_wait(&f2);
} else {
//printf("3st THREAD!\n");
printf("<THREE>");
sem_wait(&f3);
}
//}
if (done == 3) {
done = 1;
sem_post(&f1);
} else if (done == 1) {
done = 2;
sem_post(&f2);
} else if (done == 2) {
done = 3;
sem_post(&f3);
}
}
}
int main() {
pthread_t tid1, tid2, tid3;
int n1 = 1, n2 = 2, n3 = 3;
for (;;) {
// Create 3 threads
pthread_create(&tid1, NULL, threadfunc, (void *)&n1);
sleep(1);
pthread_create(&tid2, NULL, threadfunc, (void *)&n2);
sleep(1);
pthread_create(&tid3, NULL, threadfunc, (void *)&n3);
sleep(1);
// infinite loop to avoid exit of a program/process
}
return 0;
}
预期输出:ONE TWO THREE ONE TWO THREE
等。
实际输出:无
解决方案
您的代码中有多个问题:
您不仅启动了三个线程,而且启动了无限数量的线程。您的代码中的注释表明这样做的目的可能是防止主线程退出,但这是解决问题的完全不合适的方法。通常的方法是针对
pthread_join()
您的线程,或者可能只是针对sigsuspend()
orpause()
。你使用你的信号量而不初始化它们。因此,所有信号量函数的行为都是未定义的。您必须
sem_init()
在程序开始时使用来初始化每个信号量的状态,包括但不限于它的初始值。可能其中一个应该用值 1 初始化,而其他的应该用值 0 初始化。您的线程函数的结构很奇怪。通常,首先等待信号量,然后做任何工作,然后最后发布下一个信号量。但是,即使您按照自己的方式安排信号量操作,我也认为 variable 没有任何意义
done
。您对它的使用与您对n
. 两者传达相同的信息:线程的身份。如果您希望每个线程打印的数据立即出现,那么您应该
fflush(stdout)
在每次printf()
调用之后。如果你想要打印之间的延迟,那么你应该把它放在线程函数中,而不是放在
main()
.
推荐阅读
- javascript - 当 onPaste 在 contenteditable div 内时,新行将变成空 div,例如, 代替
- c# - 企业库 6 登录到数据库和电子邮件在服务器上不起作用
- python - 在 windows 10 中使用 python 3.7 导入 tensorflow 时出错
- node.js - 获取标头响应 Nuxt Axios
- python - 如何在曲线旁边显示最后一个 Y 轴值?
- angular - 与子组件的角度 ChangeDetectionStategy.OnPush 应用程序混淆
- r - 如何更改 IDE RStudio 的语言?
- keras - 关于迁移学习中不可训练的层数
- python - 修改 Bokeh 中悬停时的显示格式
- sql-server - 是否有一种简单的方法可以在目标表的一列中引用多个主键?