無輪詢版本將在未來啓動1個線程,並讓它們設置一個條件變量,以便將來做好準備。
然後你「泄漏」線程,直到期貨準備就緒,同時返回準備好的事實。
這很糟糕。但沒有投票。
要做得更好,您需要有一個可以設置(並理想地移除)的延續的未來。然後,你只需要讓期貨在完成後通知你,然後等待。這需要修改或編寫自己的未來。
這是繼續和when_any
都提出標準化的原因之一。你將來需要他們。
現在,如果你有自己的系統,你可以根據一個線程安全的隊列來傳遞東西而不是期貨,通過條件變量實現。這需要在「未來」創造點進行合作。
struct many_waiter_t {
std::mutex m;
std::condition_variable cv;
std::vector<std::size_t> index;
std::size_t wait() {
auto l = lock();
cv.wait(l, [this]{
return !index.empty();
});
auto r = index.back();
index.pop_back();
return r;
}
void set(std::size_t N) {
{
auto l = lock();
index.push_back(N);
}
cv.notify_one();
}
};
template<class T>
std::future<T> add_waiter(std::future<T> f, std::size_t i, std::shared_ptr<many_waiter_t> waiter)
{
return std::async([f = std::move(f), waiter, i]{
auto r = f.get();
waiter.set(i);
return r;
});
}
消費期貨fs
的陣列,我們可以生成期貨f2s
的一個新的數組和一個服務員,使得服務員可以是非自旋鎖等待針對直到將來準備好了,並且f2s
對應於原件fs
。
您可以重複等待waiter
,直到f2s
都準備好。
這不是'when_any()'的作用。 – Barry
這是['wait_for_any'](http://www.boost.org/doc/libs/1_64_0/doc/html/thread/synchronization.html#thread.synchronization.futures.reference.wait_for_any) 'when_any'](http://www.boost.org/doc/libs/1_64_0/doc/html/thread/synchronization.html#thread.synchronization.futures.reference.when_any)。 –
這只是一個天真而簡化的版本。關鍵問題是如何避免輪詢。 – xmllmx