使用C中的线程进行循环时获取用户输入而不会阻塞

时间:2019-04-11 20:10:36

标签: c linux pthreads user-input

我想在while循环内从用户那里获得一个值,即变量的设定值,而不会阻塞其他要执行的任务。我正在尝试使用pthreads,但是我的试用导致失败。即使我正在使用pthread,该程序也会被scanf函数阻止。

这是我在main()函数中创建pthread的方式

uint16_t refAngle = 0;
char refAngleString[64];

int main(void)
{
   pthread_t thread_id;

   while(1) {
       pthread_create(&thread_id, NULL, threadUserInput, NULL);
       pthread_join(thread_id, NULL);

       // Other functions were called below ...
   }
}

然后我将线程功能命名为 threadUserInput

void *threadUserInput(void* vargp)
{
    scanf("%s", refAngleString);
    refAngle = (uint16_t) atoi(refAngleString);
    printf("Angle is: %d\n", refAngle);

    return NULL;
}

我们将不胜感激,在此先感谢您。

1 个答案:

答案 0 :(得分:1)

  

即使我正在使用pthread,该程序也会被scanf函数阻止。

是的,是的。创建的线程在scanf()中被阻塞,父线程在pthread_join()中被阻塞,等待另一个。与直接调用线程函数相反,我很难提出启动单个线程然后立即将其加入的任何充分理由。

如果您想在循环的每个迭代中获取一次用户输入,但又执行其他一些处理(在同一迭代中)而不等待该输入,那么解决方案是将pthread_join()调用移到所有在收到用户输入之前可以完成的工作:

   while (1) {
       pthread_create(&thread_id, NULL, threadUserInput, NULL);

       // do work that does not require the user input ...

       pthread_join(thread_id, NULL);

       // do work that _does_ require the user input (if any) ...
   }

或者,也许您正在寻找更分离的东西,循环会根据需要进行尽可能多的迭代,直到输入可用为止。在这种情况下,您应该在循环的外部 中启动I / O线程,并使其保持运行状态,并在输入之后读取输入。当有可供主线程使用的输入时,让它提供某种信号。从示意图上看,可能看起来像这样:

   pthread_create(&thread_id, NULL, threadAllUserInput, NULL);

   while (1) {

       // ... some work ...

       if (get_input_if_available(/* arguments */)) {
           // handle user input ...
       }

       // ... more work ...
   }

   force_input_thread_to_stop();
   pthread_join(thread_id, NULL);

我省略了如何实现get_input_if_available()force_input_thread_to_stop()的所有细节。有多种选择,其中一些将比其他更适合您的特定需求。