Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::future::get(3)	      C++ Standard Libary	   std::future::get(3)

NAME
       std::future::get	- std::future::get

Synopsis
	  Main template
	  T get();			   (1) (since C++11)
	  std::future<T&> specializations
	  T& get();			   (2) (since C++11)
	  std::future<void> specialization
	  void get();			   (3) (since C++11)

	  The  get  member function waits (by calling wait()) until the	shared
       state is	ready,
	  then retrieves the value stored in the shared	state (if any).	 Right
       after calling
	  this function, valid() is false.

	  If  valid()  is false	before the call	to this	function, the behavior
       is undefined.

Return value
	  1) The value v stored	in the shared state, as	std::move(v).
	  2) The reference stored as value in the shared state.
	  3) (none)

Exceptions
	  If an	exception was stored in	the shared state referenced by the fu-
       ture (e.g. via a
	  call to std::promise::set_exception()) then that exception  will  be
       thrown.

Notes
	  The  C++  standard recommends	the implementations to detect the case
       when valid() is
	  false	before the call	and throw a std::future_error  with  an	 error
       condition of
	  std::future_errc::no_state.

Example
       // Run this code

	#include <chrono>
	#include <future>
	#include <iostream>
	#include <string>
	#include <thread>

	std::string time()
	{
	    static auto	start =	std::chrono::steady_clock::now();
	    std::chrono::duration<double> d = std::chrono::steady_clock::now()
       - start;
	    return "[" + std::to_string(d.count()) + "s]";
	}

	int main()
	{
	    using namespace std::chrono_literals;

	    {
		std::cout << time() << " launching thread\n";
		std::future<int> f = std::async(std::launch::async, []
		{
		    std::this_thread::sleep_for(1s);
		    return 7;
		});
		std::cout << time() << " waiting for the future, f.valid() = "
			  << f.valid() << '\n';
		int n =	f.get();
		std::cout  <<  time()  <<  "  f.get()  returned	 "  << n << ",
       f.valid() = "
			  << f.valid() << '\n';
	    }

	    {
		std::cout << time() << " launching thread\n";
		std::future<int> f = std::async(std::launch::async, []
		{
		    std::this_thread::sleep_for(1s);
		    return true	? throw	std::runtime_error("7")	: 7;
		});
		std::cout << time() << " waiting for the future, f.valid() = "
			  << f.valid() << '\n';

		try
		{
		    int	n = f.get();
		    std::cout << time()	<< " f.get() returned "	<< n
			      << ", f.valid() =	" << f.valid() << '\n';
		}
		catch (const std::exception& e)
		{
		    std::cout << time()	<< " caught exception "	<< e.what()
			      << ", f.valid() =	" << f.valid() << '\n';
		}
	    }
	}

Possible output:
	[0.000004s] launching thread
	[0.000461s] waiting for	the future, f.valid() =	1
	[1.001156s] f.get() returned with 7, f.valid() = 0
	[1.001192s] launching thread
	[1.001275s] waiting for	the future, f.valid() =	1
	[2.002356s] caught exception 7,	f.valid() = 0

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	     Applied	to		   Behavior    as    published
       Correct behavior
	  LWG  2096  C++11	 overload  (1)	needed	to  check whether T is
       not required
			      MoveAssignable

See also
	  valid	checks if the future has a shared state
		(public	member function)

http://cppreference.com		  2024.06.10		   std::future::get(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::future::get&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help