Giriş
İki çeşit future nesnesi var. Bunlar std::future ve std::shared_future. Eskiden std::future sınıfı std::unique_future olarak adlandırılmıştı. Ancak artık sadece std::future olarak değişti.
std::future dönen sonucu saklamak için bellek alanı yaratır. Bu sınıf MoveConstructable olarak düşünülebilir. Bu yüzden sonuç bir kere alınabilir.
Continuation
İki çeşit future nesnesi var. Bunlar std::future ve std::shared_future. Eskiden std::future sınıfı std::unique_future olarak adlandırılmıştı. Ancak artık sadece std::future olarak değişti.
std::future dönen sonucu saklamak için bellek alanı yaratır. Bu sınıf MoveConstructable olarak düşünülebilir. Bu yüzden sonuç bir kere alınabilir.
Continuation
C++11 Continuation için destek sağlamıyor. boost::future bu desteği sağlıyor. Şöyle yaparız.
boost::future<void> f1 = boost::async(...);
boost::future<void> f2 = f1.then(...);
boost::future<void> f3 = f2.then(...);
...
Bir gün then() metodunun da standarda girmesini ümit ediyorum.
constructor - std::async
constructor - std::async
Şöyle yaparız.
Örnek ver.
get metodu
std::future nesnesinin get() metodu bir değer döndürse bile, thread'in bittiği anlamına gelmez. thread detached değilse join ile beklemek gerekir.
std::future<int> x = std::async(()->
return 42;);
constructor - std::promiseÖrnek ver.
get metodu
std::future nesnesinin get() metodu bir değer döndürse bile, thread'in bittiği anlamına gelmez. thread detached değilse join ile beklemek gerekir.
void
set_string(std::promise<std::string>& p)
{
p.set_value("set from thread");
}
int
main()
{
std::promise<std::string> p;
std::future<std::string> f = p.get_future();
std::thread t(&set_string, std::ref(p));
std::cout << f.get() << std::endl;
t.join();
}
then metodu
Açıklaması şöyle.
Şöyle yaparız.
Nesneye bir değer atanıp atanmadığını döner. Şöyle yaparız.
Açıklaması şöyle.
Attach the continuation func to *this. The behavior is undefined if *this has no associated shared state (i.e., valid() == false)....After this function returns, valid() is false.
auto f0 = std::async([]{return 0;});
auto f1 = f0.then([](auto& f){ return f.get() + 10; });
valid metoduNesneye bir değer atanıp atanmadığını döner. Şöyle yaparız.
std::future<int> f;
if (some_condition)
f = std::async(...);
...
int x = f.valid() ? f.get() : 0;
wait_for metodu
Sonuç olarak std::future_status::ready,std::future_status::timeout dönebilir
Örnek
Şöyle yaparız.
Örnek
Şöyle yaparız.
td::future<int> future = std::async(std::launch::async, [](){
veryslow();
});
std::future_status status;
status = future.wait_for(std::chrono::milliseconds(100));
if (status == std::future_status::timeout) {
// verySlow() is not complete.
} else if (status == std::future_status::ready) {
// verySlow() is complete.
// Get result from future (if there's a need)
auto ret = future.get();
}
Örnek
Şöyle yaparız.
using namespace std::chrono_literals;
auto future = std::async(std::launch::async, &Component::recv, handler);
if(future.wait_for(500ms) == std::future_status::timeout) {
// timed out
}
Örnek
Eğer süre olarak eksi bir değer verirsek beklemeden future nesnesinin hazır olup olmadığını döner. Şöyle yaparız.template<typename R>
bool isReady(std::future<R> const& f)
{
...
return f.wait_for(std::chrono::seconds(-1)) == std::future_status::ready;
}
Hiç yorum yok:
Yorum Gönder