我做了一個相當簡單的C程序來計算我在Ubuntu上運行的Fibonacci序列的條款。我做了一些相當笨拙的數據結構,以便它可以做很大的整數,但程序的細節並不重要 - 重要的是程序可能需要相當長的時間來執行計算。在需要用戶輸入時在後臺運行帶有多個線程的C程序
出於好奇,我決定讓程序開始計算,然後讓用戶輸入一個字符來查看計算結果有多遠。所以在這種情況下,如果程序正在計算斐波那契數列的第n項並且還沒有完成,輸入數字'1'將使程序輸出當前正在計算的項k。我試圖用下面的方法做到這一點。
該程序使用scanf獲得一個長整數,它表示需要計算的序列的期限。程序然後創建一個線程,其中包含我編寫的用於計算和打印第n個斐波那契項的例程,該術語一旦完成即可退出。接下來,程序創建一個整型變量,用於存儲輸入並將其初始化爲非零值。然後,只要該int不爲零,它就會不斷進入while循環,並在循環的每次迭代中執行scanf(「%d」,& i)。然後它將該值與1進行比較,如果它是1,那麼它將打印我設置的計數器的值,以跟蹤斐波那契計算的進度。
無論如何,以上所有工作都非常順利,儘管我的線程深度問題非常嚴重。然而,我遇到的問題是,當我必須計算序列的第100萬個字節時,程序需要花費幾分鐘才能完成,並且只需在後臺運行它就會很好。但是,如果我用ctrl + z在後臺放置進程,然後鍵入bg,則進程啓動但立即再次停止。我猜測這是因爲它經常需要用戶輸入,因此它會停下來,直到它獲得輸入。
任何有關如何規避上述問題的建議將不勝感激。我並不特別擔心這個特定的問題(計算斐波納契數),因爲這只是我選擇用於計算的一個相當隨機的問題。我更感興趣的是創建用戶向程序輸入命令的基本方式的一般問題,程序然後在不同的線程中執行程序,但仍然允許用戶在必要時在後臺運行程序。
道歉的相當冗長的問題,並提前感謝任何幫助!
菲爾
編輯:根據要求,我加了(非常簡化的版本),這裏的代碼。基本思想是一樣的:程序在新線程中啓動一個冗長的計算,然後用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);
}
取而代之的是冗長的描述,你可以考慮發佈你的代碼:-) – 2011-02-10 04:26:42
採取的點!希望這可以讓事情稍微有點清晰。 – ptmx 2011-02-10 06:16:16