2 Nisan 2018 Pazartesi

std::packaged_task

Giriş
Şu satırı dahil ederiz.
#include <future>
packaged_task bir metodu başka bir thread içinden çağırmak için kullanılır. Çok alt seviye bir kullanım şeklidir. Bu kadar alt seviye bir işle uğraşmak istemiyorsak std::asynch'i kullanmak daha kolay.

Constructor - lambda
Şöyle yaparız.
std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; });
Constructor - function
int alan ve std::vector<int> dönen bir metod olsun. Şöyle yaparız.
std::vector<int> foo (int n) {

  std::vector<int> v { 2 * n, 3 * n };

  return v;
}

std::packaged_task<std::vector<int>(int)> task { foo };
Constructor - std::bind
Şöyle yaparız.
std::promise<int> promise;    
auto operation = [](std::promise<int>& promise) { promise.set_value(1); };
std::packaged_task<void ()> fn { std::bind(operation, std::move(promise)) };
Constructor - Allocator
Bu constructor C++17 ile kaldırıldı. Şöyle yaparız. Çıktı olarak 1 alırız.
int one() noexcept {
  return 1;
}

int main() {
  std::packaged_task<int()> task(std::allocator_arg, std::allocator<void>{}, one);
  task();
  std::cout << task.get_future().get() << std::endl;
}

get_future metodu
Şöyle yaparız.
std::packaged_task<...(...,...)> task (...);
auto future = task.get_future();
operator ()
Constructor içinde belirtilen metodu çağırmak için kullanılır.

Örnek
Şöyle yaparız. Bu örnekte packaged_task bir başka thread içinde çağrılmıyor.
task(); // invoke the function
Eğer parametre verilmesi gerekiyorsa şöyle yaparız.
task(2,3);
Örnek
Bir başka thread içinde çağırmak için şöyle yaparız.
std::packaged_task<...(...)> task { fooFunc };
auto& future = task.get_future();
std::thread { std::move(task), i }.detach();


future.wait();
future.get();



Hiç yorum yok:

Yorum Gönder