iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Async.H
Go to the documentation of this file.
1 /*! @file
2  @author Shane Grant <wgrant@usc.edu>
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 #ifndef INCLUDE_NRT_CORE_UTIL_ASYNC_H
36 #define INCLUDE_NRT_CORE_UTIL_ASYNC_H
37 
38 #include <future>
39 #include <nrt/config.h>
40 
41 namespace nrt
42 {
43  /*! \defgroup util General utility classes and associated functions
44  \ingroup core */
45 
46  /*! \defgroup utilasync Multi-threaded processing helpers
47  \ingroup util */
48 
49  /*! @{ */ // **********************************************************************
50 
51  //! Behaves exactly like std::async except that it will use an extensible thread pool for
52  //! asynchronous launching if NRT_USE_STD_ASYNC is false
53  /*! This function is used to launch a new thread of execution, running the passed function on the given
54  arguments. This variant uses a thread pool (if enabled) that grows as more threads are created and that recycles threads that
55  have completed, if the launch policy is async. If NRT_USE_STD_ASYNC is true, the async behavior will fall back
56  to whatever the used standard library implements.
57 
58  This is an an attempt to reduce the CPU cost of creating lots of new threads. nrt::async is used
59  extensively by the NRT Blackboard.
60 
61  @param policy The launch policy. If deferred, will exact exactly like std::async with deferred. If
62  async, the thread will launch in a thread pool
63  @param fn The function
64  @param args The function arguments
65 
66  @return A future to the async function */
67  template<typename Function, typename ... Args>
68  std::future<typename std::result_of<Function(Args...)>::type>
69  async(std::launch policy, Function && fn, Args && ... args);
70 
71  //! Behaves as if calling nrt::async with the flags std::launch::async
72  //! (i.e. async will be preferred, if available)
73  template<typename Function, typename... Args>
74  std::future<typename std::result_of<Function(Args...)>::type>
75  async(Function && fn, Args && ... args);
76  /*! @} */ // **********************************************************************
77 };
78 
80 
81 #endif // NRT_CORE_UTIL_ASYNC_H