我正在尝试制作一个带有信号灯的
我也尝试过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
etc 。
实际输出:无
答案 0 :(得分:2)
您的代码中存在多个问题:
您不仅启动了三个线程,而且还启动了无数线程。代码中的注释表明,这样做的目的可能是防止主线程退出,但这是解决问题的完全不合适的方法。通常的方法是pthread_join()
您的线程,或者可能只是sigsuspend()
或pause()
。
您可以使用信号量而不初始化它们。结果,所有信号量功能的行为都未定义。您必须在程序开始时使用sem_init()
来初始化每个信号量的状态,包括但不限于其初始值。可能其中一个应使用值1初始化,而其他应使用值0初始化。
您的线程函数的结构很奇怪。通常,需要先等待 信号量,然后再执行任何工作,然后最后发布下一个信号量。但是,即使您按原样安排信号量操作,也看不到变量done
的任何意义。您对n
的使用完全是多余的。两者传达的信息相同:线程的身份。
如果您希望每个线程打印的数据立即显示,那么您应该在每次fflush(stdout)
调用之后printf()
。
如果要在两次打印之间有延迟,则应将其放在线程函数中,而不要放在main()
中。