我在其他语言(javascript、python)中大量使用 future ,尤其是延续(当时),最近了解到类似的东西也可以在 c++ 中使用。例如像这样:
#include <iostream>
#include <string>
#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>
using namespace boost;
int main() {
future<int> f1 = async ([]() { sleep (1); return 123; });
future<std::string> f2 = f1.then ([](future<int> f) {
std::cout << f.get() << std::endl;
sleep (1);
return std::string ("foo");
});
f2.then ([](future<std::string> f) {
std::cout << f.get () << std::endl;
});
sleep (3);
}
我的目标是了解这是如何实现的,所以我在这里寻找:
https://github.com/boostorg/thread/blob/develop/include/boost/thread/future.hpp .
发生了很多事情,我想我理解了其中的大部分内容,但是关于所有这些模板魔术的一些具体细节我不理解,也无法在代码中找到。
当
f1.then()
被称为它基于回调的返回类型创建一个新的 future (f2)。如果我理解正确,回调实际上存储在 f2.当 f1 设置一个结果时,它“激活” f2 反过来调用回调并使用返回值来设置它自己的结果。我认为相关的电话发生在这里:https://github.com/boostorg/thread/blob/develop/include/boost/thread/future.hpp#L4500
似乎 f2 有一个
continuation_shared_state
内部包含对 f1 (父)的引用,但我不明白这是如何完成的。 f2 的类型只是 future<std::string>
不是 future<std::string, int>
或 future<std::string, future<int>>
.父 future 的类型不是新 future 类型的一部分,但它仍然存储在其中。这是怎么做到的?谢谢!
最佳答案
它是通过一种称为“类型删除”的技术完成的。
这不是在 boost 实现中实际完成的方式,但基本上是:f2
包含一个对象,它是一个无模板类型,具有在派生模板类型中实现的虚拟方法。这个派生的模板类型依赖于“当前” future 和父 future 的类型——>意味着它保持f1
之间的链接。和 f2
没有任何一个直接了解对方。
关于c++ - boost::future::那么它是如何实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567498/