std::promise 能否知道相应的 std::future 已取消等待?
Can a std::promise know that the respective std::future has cancelled waiting?
我的情况是我有一个连续的线程在处理某些输入。但是,有时候工作量太大,相应的future不会等到结果。
在这种情况下,我需要释放一些资源,因为计算结果将不会继续(标记为能够被释放,在其他地方)。
有没有可能让promise知道各自的future已经停止等待了?
或者我可以通过其他方式达到这种效果吗? (shared_future
, ...?)
作为概念大纲,我修改了 std::promise example,以便您更容易理解我的意思:
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
。您可以在 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);
}
}
我的情况是我有一个连续的线程在处理某些输入。但是,有时候工作量太大,相应的future不会等到结果。 在这种情况下,我需要释放一些资源,因为计算结果将不会继续(标记为能够被释放,在其他地方)。
有没有可能让promise知道各自的future已经停止等待了?
或者我可以通过其他方式达到这种效果吗? (shared_future
, ...?)
作为概念大纲,我修改了 std::promise example,以便您更容易理解我的意思:
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
。您可以在 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);
}
}