使用非阻塞键盘输入退出创建无限循环

时间:2018-03-29 08:51:17

标签: c multithreading parallel-processing pthreads

我正在尝试创建一个无限循环,直到有任何键盘输入。从我在网上找到的,一个很好的方法是使用并行线程。我的问题是我似乎无法让我的线程并行运行。我的代码是根据我在其他问题中理解的内容编写的。任何帮助,将不胜感激。我试图在不同的函数中定义每个线程的进程。

#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");
}'

2 个答案:

答案 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);

na是全局变量,所以你不需要在线程函数中传递它们就可以直接访问它们

答案 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来阻止子线程之前的主线程