我试图在C ++中学习异步编程。在Python中,我们有await
,我们可以从那里恢复一个函数,但是在C ++ future
中等待结果并停止下一行代码。如果我们不想获得结果,而是继续下一行代码,该怎么办?我怎样才能做到这一点?
答案 0 :(得分:2)
您可以使用std::future::wait_for
检查任务是否已完成执行,例如:
package main
import ("fmt"
"net/http"
"encoding/json"
)
type answer struct {
result float64
}
func index(w http.ResponseWriter, r *http.Request) {
ans := answer{result: 30}
fmt.Println(r)
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(ans); err != nil {
panic(err)
}
}
func main() {
http.HandleFunc("/",index)
fmt.Println("Server online at port localhost:8000")
http.ListenAndServe(":8000", nil)
}
Concurrency TS包括std::future::is_ready
(可能包含在C ++ 20中),这是非阻止的。如果它包含在标准中,则使用类似于:
if (future.wait_for(100ms) == std::future_status::ready) {
// Result is ready.
} else {
// Do something else.
}
或者,并发TS还包括std::future::then
,我将其解释为例如:
auto f = std::async(std::launch::async, my_func);
while (!f.is_ready()) {
/* Do other stuff. */
}
auto result = f.get();
/* Do stuff with result. */
答案 1 :(得分:1)
将来等待结果并停止下一行代码
仅在调用.get()
或未来被销毁时才会出现这种情况。您可以与std::future
并行运行多个任务:
std::future<int> f = std::async(std::launch::async, foo);
auto res0 = bar();
auto res1 = f.get();
在上面的示例中,bar
和foo
将并行运行。
如果要将异步延续附加到现有的未来,目前您无法使用std::future
执行此操作。
boost::future
支持非阻止.then(...)
,.when_all(...)
和.when_any(...)
延续。这些建议用于"Extensions for concurrency"中的标准化。
还有"Coroutines" TS旨在介绍可恢复的功能和co_await
/ co_yield
。
不出所料,boost
还提供了一个协程库,可以在今天用它来实现可恢复的功能。