27 Haziran 2018 Çarşamba

std::future

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
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
Şöyle yaparız.
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.
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.
Şöyle yaparız.
auto f0 = std::async([]{return 0;});
auto f1 = f0.then([](auto& f){ return f.get() + 10; });
valid metodu
Nesneye 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.
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