Udostępnij za pośrednictwem


<future>, funkcje

async
future_category
make_error_code
make_error_condition
swap|

async

Reprezentuje dostawcę asynchronicznego.

template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
    async(Fn&& fn, ArgTypes&&... args);

template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
    async(launch policy, Fn&& fn, ArgTypes&&... args);

Parametry

policy
launch Wartość.

Uwagi

Definicje skrótów:

Skrót opis
dfn Wynik wywołania metody decay_copy(forward<Fn>(fn)).
dargs Wyniki wywołań decay_copy(forward<ArgsTypes>(args...)).
Ty Typ result_of<Fn(ArgTypes...)>::type.

Pierwsza funkcja szablonu zwraca wartość async(launch::any, fn, args...).

Druga funkcja zwraca future<Ty> obiekt, którego skojarzony stan asynchroniczny zawiera wynik wraz z wartościami dfn i dargs i obiektem wątku, aby zarządzać oddzielnym wątkiem wykonywania.

Chyba że decay<Fn>::type jest typem innym niż uruchamianie, druga funkcja nie uczestniczy w rozwiązywaniu przeciążeń.

Standard C++ stwierdza, że jeśli zasady to launch::async, funkcja zachowuje się tak, jakby wywołuje obiekt wywoływany w nowym wątku. Oznacza to, że chociaż zazwyczaj powoduje utworzenie nowego wątku, implementacja może używać innych mechanizmów do osiągnięcia równoważnego zachowania. Jednak implementacja firmy Microsoft obecnie nie jest zgodna wyłącznie z tym zachowaniem. Uzyskuje wątki z puli wątków systemu Windows, które mogą zapewnić wątki z recyklingu, a nie nowe. Oznacza to, że launch::async zasady są skutecznie implementowane jako launch::async|launch::deferred. Kolejną implikacją implementacji opartej na puli ThreadPool jest to, że nie ma gwarancji, że zmienne lokalne wątku zostaną zniszczone po zakończeniu wątku. Jeśli wątek jest przetwarzany i dostarczany do nowego wywołania metody async, stare zmienne nadal istnieją. Zalecamy unikanie używania zmiennych lokalnych wątku za pomocą asyncpolecenia .

Jeśli policy parametr ma launch::deferredwartość , funkcja oznacza skojarzony stan asynchroniczny jako przechowując funkcję odroczoną i zwracaną. Pierwsze wywołanie dowolnej niegodzinnej funkcji, która czeka na gotowość skojarzonego stanu asynchronicznego, wywołuje funkcję odroczoną, oceniając INVOKE(dfn, dargs..., Ty)funkcję .

We wszystkich przypadkach skojarzony stan future asynchroniczny obiektu nie jest ustawiony na gotowy do momentu ukończenia oceny INVOKE(dfn, dargs..., Ty) , zgłaszając wyjątek lub zwracając normalnie. Wynikiem skojarzonego stanu asynchronicznego jest wyjątek, jeśli został zgłoszony lub wartość zwracana przez ocenę.

Uwaga

W przypadku elementu future— lub ostatniego shared_future— dołączonego do zadania uruchomionego z elementem std::async, destruktor blokuje, jeśli zadanie nie zostało ukończone. Oznacza to, że blokuje, jeśli ten wątek nie został jeszcze wywołany .get() lub .wait() zadanie jest nadal uruchomione. future Jeśli obiekt uzyskany z std::async zostanie przeniesiony poza zakres lokalny, inny kod, który go używa, musi pamiętać, że jego destruktor może zablokować stan udostępniony, aby stał się gotowy.

Pseudo-funkcja INVOKE jest zdefiniowana w pliku <functional>.

Specyficzne dla firmy Microsoft

Gdy przekazana funkcja jest wykonywana asynchronicznie, jest wykonywana w puli wątków systemu Windows. Aby uzyskać więcej informacji, zobacz Pule wątków. Liczba współbieżnych wątków jest ograniczona do domyślnej puli wątków, czyli 500 wątków.

Przed systemami Windows 11 i Windows Server 2022 aplikacje były domyślnie ograniczone do jednej grupy procesorów, która ma co najwyżej 64 procesory logiczne. Ogranicza to liczbę równoczesnych wątków do 64. Aby uzyskać więcej informacji, zobacz Grupy procesorów.

Począwszy od systemów Windows 11 i Windows Server 2022, procesy i ich wątki mają koligacje procesora, które domyślnie obejmują wszystkie procesory w systemie i w wielu grupach na maszynach z ponad 64 procesorami. Limit liczby równoczesnych wątków jest teraz całkowitą liczbą procesorów logicznych w systemie.

future_category

Zwraca odwołanie do error_category obiektu, który charakteryzuje błędy skojarzone z obiektami future .

const error_category& future_category() noexcept;

make_error_code

Tworzy error_code wraz z obiektem error_category, który charakteryzuje przyszłe błędy.

inline error_code make_error_code(future_errc Errno) noexcept;

Parametry

Errno
future_errc Wartość identyfikująca zgłoszony błąd.

Wartość zwracana

error_code(static_cast<int>(Errno), future_category());

make_error_condition

Tworzy obiekt error_condition wraz z obiektem error_category , który charakteryzuje future błędy.

inline error_condition make_error_condition(future_errc Errno) noexcept;

Parametry

Errno
future_errc Wartość identyfikująca zgłoszony błąd.

Wartość zwracana

error_condition(static_cast<int>(Errno), future_category());

swap

Wymienia skojarzony stan asynchroniczny jednego promise obiektu z innym.

template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;

template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;

Parametry

Left
Lewy promise obiekt.

Right
Właściwy promise obiekt.

Zobacz też

<future>