当需要用户输入时,在后台运行具有多个线程的C程序

前端之家收集整理的这篇文章主要介绍了当需要用户输入时,在后台运行具有多个线程的C程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经制作了一个相当简单的C程序来计算Fibonacci序列的术语,我正在Ubuntu上运行.我做了一些相当笨拙的数据结构,以便它可以做很大的整数,但程序的细节并不是非常重要 – 重要的是程序可能需要很长时间来执行计算.

出于好奇,我决定让程序开始计算,然后允许用户输入一个字符来查看计算的距离.因此,在这种情况下,如果程序正在计算Fibonacci序列的第n项并且尚未完成,则输入数字“1”将使程序输出它当前正在计算的项k.我尝试使用以下方法来做到这一点.

该程序使用scanf获得一个长整数,表示需要计算的序列的项.然后程序创建一个线程,其中包含我编写的例程,用于计算和打印第n个Fibonacci项,一旦完成,就会退出.之后,程序创建一个整数变量,用于存储输入并初始化它,使其具有非零值.然后,只要该int非零,它就连续进入while循环,并且在循环的每次迭代中,它执行scanf(“%d”,& i).然后它将该值与1进行比较,如果它为1,那么它将打印我设置的计数器的值以跟踪斐波纳契计算的进度.

无论如何,尽管我对线程之类的东西非常不敏感,但上述所有工作都非常顺利.但是,我遇到的问题是,当我必须计算序列的第一百万个项时,程序需要几分钟才能完成,而在后台运行它会很不错.但是,如果我使用ctrl z将进程置于后台然后键入bg,则进程将启动但会立即再次停止.我猜这是因为它不断要求用户输入,因此它会停止,直到它获得输入.

任何关于如何规避上述问题的建议都将不胜感激.我并不特别担心这个特定问题(Fibonacci数的计算),因为这只是我选择用于计算的一个相当随机的问题.我对创建用户向程序输入命令的基本方法的一般问题更感兴趣,然后程序在单独的线程中执行,但仍然允许用户在必要时在后台运行程序.

为这个相当冗长的问题道歉,并提前感谢任何帮助!

菲尔

编辑:根据请求,我在这里添加了(一个非常简化的版本)代码.基本思路是一样的:程序在新线程中启动一个冗长的计算,然后使用scanf循环输入.输入0退出程序,输入1显示一个指示计算进度的计数器.我希望能够在后台运行该程序,但由于它不断要求输入,它会立即停止该过程.忽略计数器上的算术溢出;我的实际程序有数据结构来处理这种东西,但我尽可能地简化我的代码以便于阅读.

//Simple program to test threading and input.
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 2

void *stuff();
int counter; //keeps track of the progress of the computation

int main(){
  counter=1;
  pthread_t threads[NUM_THREADS];
  pthread_create(&threads[0],NULL,stuff,NULL);

  //loop while the input is non-zero so that the program can
  //accept commands
  int input=10;
  while(input){
    input=10;
    printf("Enter 0 to exit or 1 to display progress: ");
    scanf("%d",&input);
    if(input==1){
      printf("Currently iterating for the %dth time.\n",counter);
    }
  }

return 0;
}

//Randomly chosen computation that takes a while.
void *stuff(){
  long i,j,n=1000000000;
  for(i=0; i<=n; i++){
    for(j=0; j<=n; j++){
      i*i*i*i*i*i*i*i*i*i*i;
      j*j*j*j*j*j*j*j*j*j*j;
      counter++;
    }
  }
  printf("Done.\n");
  pthread_exit(NULL);
}

解决方法

假设你正在使用POSIX线程,你可以在一个线程中扫描,让它阻塞直到输入一些东西,然后pthread_cond_signal另一个线程做你想做的任何事情.您还可以声明一个由计算线程更新的变量,并由具有scanf的线程读取.另一种更复杂的方法是在套接字上侦听传入的消息,并有一个消息解释器部分从该套接字读取,并写回结果.在这种情况下,您不需要scanf,您的程序可以在后台运行.

猜你在找的C&C++相关文章