[英]C++ : Add a callback that will be executed when an std::future is done
[英]When does std::future get executed?
創建啟動策略設置為std::launch::async
的線程時,在cppreference上給出的描述為
啟動新線程以異步執行任務
如果我有一些任意功能
double Foo(double i)
{
return i * 5.0;
}
我像這樣設置了一個async
調用
std::vector<double> values{5.0, 2.3, 7.1, 4.8, 1.5};
std::vector<std::future<double>> answers;
for (double value : values)
{
answers.push_back(std::async(std::launch::async,
Foo,
value));
}
當我調用std::accumulate
像這樣:
double total = std::accumulate(begin(answers),
end(answers),
0.0,
[](double x, std::future<double>& t){return x + t.get();});
每個線程何時開始執行? 他們一被添加到answers
就開始嗎? 還是他們等到調用get
之前? 如果是這樣,我是否只是因為它們的get
以accumulate
執行它們的順序被調用而強迫它們按順序執行? 換句話說,我是否只是在浪費時間建立這些期貨,然后強迫它們同步運行?
注意
函數Foo
只是一些示例,我正在使用的實際函數可以完成更多工作。
實際上,它們是在您創造future
時開始的。 它可能僅計划執行,或者實際上可能在async
調用返回之前啟動。
可能會嘗試通過線程池等保持每次運行一定數量的線程(至少在最初階段),至少這是一次嘗試,但這是實現質量的問題,並且在不造成干擾或不要求被調用者更多的情況下實現正確功能很難。
該標准並未強制要求任何接近該行為級別的行為,但實際上,異步異步實際上是異步的。
一旦調用std::async
,線程將開始啟動。 這樣,您的線程將同時運行。
引用cpp-reference :
如果設置了異步標志(即policy&std :: launch :: async!= 0),則異步將在新的執行線程(已初始化所有線程本地變量)上執行函數f,就像由std :: thread產生(f,args ...),不同之處在於,如果函數f返回值或引發異常,則它將存儲在可通過std :: future訪問的共享狀態中,異步返回給調用者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.