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

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

概述我已经制作了一个相当简单的C程序来计算Fibonacci序列的术语,我正在Ubuntu上运行.我做了一些相当笨拙的数据结构,以便它可以做很大的整数,但程序的细节并不是非常重要 – 重要的是程序可能需要很长时间来执行计算. 出于好奇,我决定让程序开始计算,然后允许用户输入一个字符来查看计算的距离.因此,在这种情况下,如果程序正在计算Fibonacci序列的第n项并且尚未完成,则输入数字“1”将使程序 我已经制作了一个相当简单的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 2voID *stuff();int counter; //keeps track of the progress of the computationint 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程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存