我正在尝试创建一个无限循环,直到有任何键盘输入。从我在网上找到的,一个很好的方法是使用并行线程。我的问题是我似乎无法让我的线程并行运行。我的代码是根据我在其他问题中理解的内容编写的。任何帮助,将不胜感激。我试图在不同的函数中定义每个线程的进程。
#include <stdio.h>
#include <pthread.h>
int n=0, a=0;
void *check(int *q){
*q = getchar();
pthread_exit(NULL);
}
void *loop(int q){
while(1){
printf("%d\n", q++);
if(a!=0)
break;
}
pthread_exit(NULL);
}
int main(void){
printf("start program\n");
pthread_t threads[2];
pthread_create(&threads[0], NULL, check(&a), (void *) a);
printf("start loop\n");
pthread_create(&threads[1], NULL, loop(n), (void *) n);
printf("end program\n");
}'
答案 0 :(得分:1)
pthread_create(&threads[0], NULL, check(&a), (void *) a);
pthread_create(&threads[1], NULL, loop(n), (void *) n);
这是未定义的行为,你应该传递函数指针但是你调用那些线程函数,这些函数的返回值将被视为可能导致未定义行为的函数指针 您应该创建线程:
pthread_create(&threads[0], NULL, check, (void *) NULL);
pthread_create(&threads[1], NULL, loop, (void *) NULL);
n
和a
是全局变量,所以你不需要在线程函数中传递它们就可以直接访问它们
答案 1 :(得分:1)
以下是pthread_create int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
根据语法,第三个参数应该是void *(* start_routine)(void *)类型的函数指针。相反,你完成了没有返回值的函数调用。
另外请使用pthread_join来阻止子线程之前的主线程