C ++异步编程,如何不等待未来?

时间:2018-03-17 15:13:43

标签: c++ multithreading asynchronous c++17

我试图在C ++中学习异步编程。在Python中,我们有await,我们可以从那里恢复一个函数,但是在C ++ future中等待结果并停止下一行代码。如果我们不想获得结果,而是继续下一行代码,该怎么办?我怎样才能做到这一点?

2 个答案:

答案 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. */

另见:How to check if a std::thread is still running?

答案 1 :(得分:1)

  

将来等待结果并停止下一行代码

仅在调用.get()或未来被销毁时才会出现这种情况。您可以与std::future并行运行多个任务:

std::future<int> f = std::async(std::launch::async, foo);
auto res0 = bar();
auto res1 = f.get();

在上面的示例中,barfoo将并行运行。

如果要将异步延续附加到现有的未来,目前您无法使用std::future执行此操作。

boost::future支持非阻止.then(...).when_all(...).when_any(...)延续。这些建议用于"Extensions for concurrency"中的标准化。

还有"Coroutines" TS旨在介绍可恢复的功能和co_await / co_yield

不出所料,boost还提供了一个协程库,可以在今天用它来实现可恢复的功能。