gpt4 book ai didi

c++ - 实现类似async的功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:31 31 4
gpt4 key购买 nike

我有一个返回future 的函数foofoo 将注册一个回调,该回调将在 foo 返回后调用。

future<int> foo() {
promise<int> p;
future<int> ret(p.get_future());
thread(bind([] (promise<int> &&p) {
this_thread::sleep_for(chrono::seconds(3));
p.set_value(10);
}, move(p))).detach();
return move(ret);
}

int main()
{
auto f = foo();
cout << f.get() << endl;
return 0;
}

但似乎 std::bind 将右值引用转发为左值引用,因此无法成功编译。有什么办法可以解决吗?


我必须编写一个丑陋的类来移动 promise 对象:

template<typename T>
class promise_forward {
promise<T> promise_;

public:
promise_forward(promise<T> &&p) :
promise_(move(p)) {}

promise_forward(promise_forward<T> &&other) :
promise_(move(other.promise_)) {}

operator promise<T> () {
return move(promise_);
}
};

future<int> foo() {
promise<int> p;
future<int> ret(p.get_future());
thread(bind([] (promise<int> &&p) {
this_thread::sleep_for(chrono::seconds(3));
p.set_value(10);
}, promise_forward<int>(move(p)))).detach();
return ret;
}

int main()
{
auto f = foo();
cout << f.get() << endl;
return 0;
}

最佳答案

基本上,您在这里不需要 std::bind(好吧,我相信 =))。这是一个最简单的异步任务启动器的快速草稿。它几乎与您的相同,但是更通用一点:它可以接受任何函数对象并且侵入性较小:函数对象根本不知道 promise 或线程。

可能存在错误(我很确定它们是错误的)。而且,当然,它离 std::async 实现很远(通常,它不仅仅是线程启动器,但理想情况下,有一个巨大的线程管理后端)。

#include <thread>
#include <future>
#include <iostream>
#include <chrono>


template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type> my_async(Function && f, Args && ... args)
{
typedef typename std::result_of<Function(Args...)>::type ret_type;

std::promise<ret_type> p;

auto fut = p.get_future();


// lambda in separate variable, just to improve readability
auto l = [](Function && f, Args && ... args, std::promise<ret_type> && p)
{
p.set_value(f(args...));
};

std::thread th(l, std::move(f), std::move(args...), std::move(p));

th.detach();

return std::move(fut);

}

int wannaRunAsync(int i)
{
return i;
};

int main()
{

auto fut = my_async(&wannaRunAsync, 42);

auto fut2 = my_async([](int i) -> int { return i; }, 42);

std::cout << fut.get() << std::endl;
std::cout << fut2.get() << std::endl;

std::cin.get();

return 0;
}

我能够编译并运行它 g++-4.8clang++但是对于 msvc 2012 和 2013 预览版,它甚至无法编译(可能是由于错误)。

我根本没有测试过这段代码,所以要小心 =) 希望它能有所帮助。

关于c++ - 实现类似async的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619326/

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