c++ - boost 等效于 std::async()

标签 c++ boost asynchronous c++11

如果不直接使用 boost::threadboost::bind,有没有办法实现以下代码的等价物?

std::string func()
{
    std::string str("Hello from async task!");
    return str;
}

int main()
{
    auto ftr = std::async(&func);
    std::cout << "Hello from main!";
    std::string str = ftr.get();
    std::cout << str << std::endl;      
    return 0;
}

具体来说,这部分:auto ftr = std::async(&func); ?

最佳答案

当然。只需制作 async<T>(std::function<T()>)返回调用 func() 的 future 第一次等待的那一刻。您不会获得任何异步性,但 API 实际上并不能保证该函数将异步运行,因此这不是问题。

如果您可以访问特定于操作系统的线程库,您当然也可以使用它。

但是请注意,存储异常无法移植;它需要 C++ 实现的额外支持,除非您可以将支持的异常限制为具有多态克隆函数的异常。参见 this question获取更多信息。

最终的实现可能看起来有点像这样(未经测试):

// NOTE - we assume a SINGLE THREADED environment

template<typename T>
class myfuture_detail {
    mutable boost::variant<T, boost::function<T()> > val;

public:
    myfuture_detail(const boost::function<T()> &f)
        : val(f) { }

    const T &get() const {
        if (T *t = boost::get<T>(&val)) {
            return *t;
        } else {
            boost::function<T()> f = *boost::get<boost::function<T> >(&val);
            val = f();

            T *t = boost::get<T>(&val);
            assert(t);

            return *t;
        }
    }
};

template<typename T>
class myfuture {
    boost::shared_ptr<myfuture_detail<T> > ptr;

public:
    myfuture(const boost::function<T()> &f)
        : ptr(boost::make_shared<myfuture_detail<T> >(f))
    {}

    myfuture() { }

    const T &get() const {
        return ptr->get();
    }
};

关于c++ - boost 等效于 std::async(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8876459/

相关文章:

c++ - Boost 库队列问题

c++ - 在 iPhone 上使用 C++ 中的 Unicode 的最佳方式是什么?

c++ - 在标准算法中,通过引用捕获哪里更正确?

c++ - MFC:为什么会发生这种堆损坏? (array_s.cpp/afxcoll.inl)

c++ - token 之前的预期主要表达式

java - 使用 Future 异步读取文件

c++ - 创建自定义 boost 序列化输出存档

c++ - 使用boost将单线程变成多线程

javascript - 如何延迟响应直到 POST 有效负载得到验证

unit-testing - 使用 jasmine 进行 Angular2 异步单元测试