我写了这个示例代码来测试boost::future
继续在我的应用程序中使用。boost :: future :: then()不会返回将来的销毁块
#include <iostream>
#include <functional>
#include <unistd.h>
#include <exception>
#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>
void magicNumber(std::shared_ptr<boost::promise<long>> p)
{
sleep(5);
p->set_value(0xcafebabe);
}
boost::future<long> foo()
{
std::shared_ptr<boost::promise<long>> p =
std::make_shared<boost::promise<long>>();
boost::future<long> f = p->get_future();
boost::thread t([p](){magicNumber(p);});
t.detach();
return f;
}
void bar()
{
auto f = foo();
f.then([](boost::future<long> f) { std::cout << f.get() << std::endl; });
std::cout << "Should have blocked?" << std::endl;
}
int main()
{
bar();
sleep (6);
return 0;
}
当编译,连接,并与升压版本1.64.0_1运行,我得到以下输出:
Should have blocked?
3405691582
但根据boost::future::then
的文档here。 执行应在f.then()
在功能bar()
被阻止,因为boost::future<void>
类型的临时变量应在破坏块,输出应该是
3405691582
Should have blocked?
在我的应用程序虽然,调用f.then()
是阻断执行,直到继续没有被调用。 这里发生了什么?
我很好奇 - 是必须提升使用率吗?我只能使用标准功能https://gist.github来做同样的事情。com/artemyv/baab7c8c74bb7fde07ebdcf2aee19881 –
@ArtemyVysotsky不,实现相同的功能在这里是没有问题的。这个问题几乎没有好奇心。另外,使用.then在组合性方面似乎更好,而不是使用if-else。你会意识到在std :: async创建期货时会发生同样的行为,它们会阻止破坏,这应该发生在这里,并且也发生在我的应用程序代码中。我的问题是为什么它不会发生在这种情况下。或者也可以被其他人重现。谢谢你的意见。 – vvineett