Я нахожусь в ситуации, когда у меня есть непрерывный поток, работающий на некотором входе. Однако иногда рабочая нагрузка слишком высока, и соответствующее будущее не будет ждать результата.
В этом случае мне нужно освободить некоторые ресурсы, так как результат вычисления не будет продолжаться (чтобы быть помеченным как возможность быть освобожденным где-то еще).
Возможно ли обещание узнать, что соответствующее будущее перестало ждать?
Или я мог бы добиться этого эффекта другими способами? (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);
}
Не через 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);
}
}
Других решений пока нет …