Может ли std :: обещать, что соответствующее std :: future отменило ожидание?

Я нахожусь в ситуации, когда у меня есть непрерывный поток, работающий на некотором входе. Однако иногда рабочая нагрузка слишком высока, и соответствующее будущее не будет ждать результата.
В этом случае мне нужно освободить некоторые ресурсы, так как результат вычисления не будет продолжаться (чтобы быть помеченным как возможность быть освобожденным где-то еще).

Возможно ли обещание узнать, что соответствующее будущее перестало ждать?
Или я мог бы добиться этого эффекта другими способами? (shared_future, …?)

В качестве основы концепции я изменил пример std :: обещания, для вашего более легкого понимания того, что я имею в виду:

using namespace std::chrono_literals;

void accumulate(std::vector<int>::iterator first,
std::vector<int>::iterator last,
std::promise<int> accumulate_promise)
{
int sum = std::accumulate(first, last, 0);

/* Can I possibly know that the corresponding future has stopped
* waiting for this promise, at this very position?
*/
accumulate_promise.set_value(sum);
}

int main()
{
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6 };
std::promise<int> accumulate_promise;
std::future<int> accumulate_future = accumulate_promise.get_future();
std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
std::move(accumulate_promise));

/* Do not wait forever */
accumulate_future.wait_for(1ms);
}

1

Решение

Не через std::promise, Вы можете включить токен вместе с обещанием, чтобы указать, должен ли он продолжаться.

using namespace std::chrono_literals;

void accumulate(std::vector<int>::iterator first,
std::vector<int>::iterator last,
std::promise<int> accumulate_promise,
std::atomic<bool> & cancellation_token)
{
int sum = std::accumulate(first, last, 0);

if (cancellation_token.load()) return;

accumulate_promise.set_value(sum);
}

int main()
{
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6 };
std::promise<int> accumulate_promise;
std::atomic<bool> token(false);
std::future<int> accumulate_future = accumulate_promise.get_future();
std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
std::move(accumulate_promise), std::ref(token));

if (accumulate_future.wait_for(1ms) != std::future_status::ready)
{
token.store(true);
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]