C ++: функция тайм-аута вне функции - PullRequest
1 голос
/ 18 января 2020

У меня есть функция, которая выполняет потенциально очень медленные вычисления (см. Ниже пример базового c). Функция не записывает в существующие ресурсы, не имеет побочных эффектов и использует только автоматическое выделение c для всех своих переменных (поэтому new и delete никогда не вызываются вне каких-либо вызовов в стандартной библиотеке).

Возможно ли отключить функцию по истечении определенного времени и освободить запрошенную память кучи, без изменения самой функции?

//Returns all primes up to n (fairly bad implementation; the idea is that it runs too long)
std::vector<int> primes(int n) {
    std::vector<int> list={2};
    for (int i = 3; i <= n; i++) {
        bool flag= 0;
        for (const auto& j : list) {
            if (i % j == 0) {
                flag= 1;
                break;
            }
        }
        if (!flag)
            list.push_back(i);
    }
    return list;
}

И main выглядит следующим образом:

int main(){
std::vector<std::vector<int>> list_of_lists(6);
#pragma omp parallel for num_threads(6)
    for (int n = 1; n < 7; n++) {
       //I want the assignment below to make list_of_lists[n-1] empty if it takes more than 5 secs
        list_of_lists[n-1] = primes(n*100000);
    }
//use the list_of_lists
}

Сама функция primes не должна изменяться.

Существует способ использовать std::async для проверки за время, прошедшее извне функции, но, к сожалению, нет способа убить std::future до ее завершения. Поэтому мне интересно, как лучше это сделать.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Без функции, любое «завершение» рискованно. Лучшее, что вы можете сделать, это использовать al oop, который периодически проверяет наличие флага «прекращения», видимого вне функции и выхода, или для измерения времени, прошедшего внутри функции.

for(;;)
{
    if (bExit)
       break;

    // calculations here
}

Плохой способ запустить функцию в потоке, который должен быть завершен через некоторое время.

0 голосов
/ 18 января 2020

Строго не существует способа узнать, когда это безопасно и как можно было бы исправить изменяемое состояние программы при запуске функции.

Функция может распределять ресурсы, даже внутренняя программа Ressources. Для этого ему необходимо изменить глобальные структуры данных, и эти модификации, вероятно, не являются атомами c и не будут корректно изменены, если бы они были.

Вам необходимо некоторое сотрудничество.

...