gpt4 book ai didi

c++ - boost::future 和 continuations - 值集,但 future 仍然阻塞

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:04 25 4
gpt4 key购买 nike

我正在尝试使以下继续工作 - 但 f.get() 阻塞。怎么了?

#include <iostream>

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>

struct Foo {

boost::future<int> start() {
return p.get_future();
}

void finish() {
p.set_value(23);
}

boost::promise<int> p;
};

int main () {

Foo foo;

foo.start().then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

foo.finish();
}

它会打印 “done:”,所以 future 会触发,但它只会在 f.get() 上“挂起”.. 我我迷路了。

构建:

clang++ -o test8 -std=c++11 -stdlib=libc++ -lboost_thread -lboost_system \
-I/home/oberstet/boost_1_55_0 -L/home/oberstet/boost_1_55_0/stage/lib \
test8.cpp

更新:以下代码更改将使该示例有效 - 但为什么呢?因为无论如何都没有使用 f2 。又是一头雾水。

   boost::future<void> f2 = foo.start().then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

更新 2:以下添加启动策略 launch::deferred 也将起作用:

   foo.start().then(boost::launch::deferred, [](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

还有这个:

   boost::future<int> start() {
boost::future<int> f = p.get_future();
f.set_deferred();
return f;
}

最佳答案

问题是,你沉着冷静的 future 并不存在。事实上,它是一个临时对象,一旦语句(使用 .then())结束,它就会被破坏。

修复它:

int main () {
Foo foo;

auto f1 = foo.start();
auto f2 = f1.then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

foo.finish();
f2.get();
}

现在打印

done:
23

查看 Live On Coliru

如果将 f2.get() 移动到 foo.finish() 之前,它将再次死锁。

关于c++ - boost::future 和 continuations - 值集,但 future 仍然阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617420/

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