ptm*_*tmx 7 c ubuntu background pthreads input
我已经制作了一个相当简单的C程序来计算Fibonacci序列的术语,我正在Ubuntu上运行.我做了一些相当笨拙的数据结构,因此它可以做很大的整数,但程序的细节并不是非常重要 - 重要的是程序可能需要很长时间来执行计算.
出于好奇,我决定让程序开始计算,然后允许用户输入一个字符来查看计算的距离.因此,在这种情况下,如果程序正在计算Fibonacci序列的第n个项并且尚未完成,则输入数字"1"将使程序输出它当前正在计算的项k.我尝试使用以下方法来做到这一点.
该程序使用scanf获得一个长整数,表示需要计算的序列的项.然后程序创建一个线程,其中包含我编写的例程,用于计算和打印第n个Fibonacci项,一旦完成,就会退出.之后,程序创建一个整数变量,用于存储输入并将其初始化为一些非零值.然后它继续进入while循环,只要该int非零,并且在循环的每次迭代中它执行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);
}
Run Code Online (Sandbox Code Playgroud)
假设您正在使用 POSIX 线程,您可以scanf
在一个线程中让它阻塞,直到输入某些内容,然后pthread_cond_signal
另一个线程执行您想要它执行的任何操作。您还可以声明一个由计算线程更新并由其中的线程读取的变量scanf
。另一种更复杂的方法是在套接字上侦听传入消息,并使用消息解释器部分从该套接字读取数据并写回结果。在这种情况下,您不需要scanf
,并且您的程序可以在后台运行。
归档时间: |
|
查看次数: |
5457 次 |
最近记录: |