gpt4 book ai didi

c++ - C++ broken_promise异常

转载 作者:行者123 更新时间:2023-12-02 09:53:37 25 4
gpt4 key购买 nike

我正在学习std::async,并遇到了broken_promise异常。

但是,以下示例代码似乎并没有引起 promise 异常。
我的理解是,当 promise 被破坏而 future 仍在等待时,应该抛出异常。但是,在我的代码中,对future.get()的调用将永远等待。

lambda完成后,是否应该不调用promise的析构函数并抛出异常?

int main()
{
std::promise<int> prom;
std::future<int> fut = prom.get_future();
auto retFut = std::async(std::launch::async, [prom = std::move(prom)] () mutable {
cout << "In child" << endl;
//prom.set_value(4); <-- Shouldn't not having this line cause the exception
});

int childValue = fut.get();
cout << "Child has set the value: " << childValue << endl;
return 0;
}


甚至是这个 child 期望得到 promise 的计划
void DoSomething(std::future<int>&& fut)
{
cout << "Waiting for parent to send a value " << endl;
int val = fut.get();

cout << "Parent sent value " << val << endl;
}

int main()
{
std::promise<int> prom;
std::future<int> fut = prom.get_future();
auto retFut = std::async(std::launch::async, DoSomething, std::move(fut));
// prom.set_value(3); <-- This should cause the exception?
return 0;
}

最佳答案

主要问题是等待错误的 future 。

你在等

int childValue = fut.get();

你什么时候应该等待
int childValue = retFut.get();

话虽如此, std::async是C++最好避免的一部分。实际上,它很少交付,在复杂的项目中,最好使用某种任务池,例如 cpp-taskflow

关于c++ - C++ broken_promise异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62238337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com