Я сделал довольно простую C-программу для вычисления терминов последовательности Фибоначчи, которую я запускаю в Ubuntu. Я сделал несколько довольно неуклюжих структур данных, чтобы они могли выполнять очень большие целые числа, но специфика программы не так уж важна - важно то, что программе может потребоваться довольно много времени для выполнения вычислений.
Из любопытства я решил, что хотел бы, чтобы программа запустила вычисления, а затем позволила пользователю ввести символ, чтобы увидеть, как далеко продвинулись вычисления. Таким образом, в этом случае, если программа вычисляет n-й член последовательности Фибоначчи, и это еще не сделано, ввод числа «1» заставит программу вывести термин k, который она вычисляет в настоящее время. Я попытался сделать это, используя следующий подход.
Программа использует scanf для получения длинного целого числа, которое представляет член последовательности, который необходимо вычислить. Затем программа создает поток с подпрограммой, которую я написал, чтобы вычислить и напечатать n-й термин Фибоначчи, который завершается, как только он заканчивает это делать. После этого программа создает целочисленную переменную, которую я использовал для хранения входных данных, и инициализирует ее, чтобы получить ненулевое значение. Затем он непрерывно входит в цикл while, пока int не равен нулю, и на каждой итерации цикла он выполняет scanf ("% d", & i). Затем он сравнивает это значение с 1, и, если оно равно 1, он выводит значение счетчика, который я настроил для отслеживания хода вычислений Фибоначчи.
В любом случае, все вышеперечисленное работает очень плавно, несмотря на то, что я ужасно не в курсе таких вещей, как нити. Однако проблема, с которой я сталкиваюсь, заключается в том, что когда мне нужно вычислить, скажем, миллионный член последовательности, программе требуется несколько минут, и было бы неплохо просто запустить его в фоновом режиме. Однако, если я поместил процесс в фоновом режиме с помощью ctrl + z, а затем набрал bg, процесс запустится, но сразу остановится снова. Я предполагаю, что это потому, что он постоянно требует ввода от пользователя и поэтому останавливается, пока не получит этот ввод.
Буду очень признателен за любые предложения по обходу вышеуказанного вопроса. Меня не особенно волнует эта конкретная проблема (вычисление чисел Фибоначчи), поскольку это просто довольно случайная проблема, которую я выбрал для вычисления. Меня больше интересует общая проблема создания базового способа для пользователя вводить команды в программу, которую программа затем выполняет в отдельных потоках, но которая все же позволяет пользователю запускать программу в фоновом режиме, если это необходимо.
Извиняюсь за довольно скучный вопрос, и заранее благодарю за любую помощь!
Phil
Редактировать: По запросу я добавил (очень упрощенная версия) код здесь. Основная идея та же: программа запускает длительные вычисления в новом потоке, а затем выполняет цикл для ввода с помощью 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);
}