iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
test-ThreadPool.C
Go to the documentation of this file.
1 /*! @file
2  @author
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 
37 #include <nrt/Core/Debugging/Log.H>
38 #include <thread>
39 #include <math.h>
40 
41 int main()
42 {
43  NRT_INFO("Testing ThreadPool...");
44 
45  // create a vector of functions; here we just use a bunch of C++11 lambda functions that sleep for a while and then
46  // print something:
47  std::vector<std::function<void()> > funs;
48  for (int i = 0; i < 30; ++i)
49  {
50  std::function<void()> fun = [=]() { usleep(rand()/1000); NRT_INFO(i); };
51  funs.push_back(fun);
52  }
53 
54  nrt::ThreadPool threadPool(4);
55  NRT_INFO("Pushing " << funs.size() << " jobs onto a pool of " << threadPool.numWorkers() << " worker threads...");
56  auto sync = threadPool.pushJobs(funs);
57  sync.wait();
58  NRT_DEBUG("DONE");
59 
60 
61  // Now push the jobs one by one, we get one future for each job:
62  NRT_INFO("Testing ThreadPool, pushing jobs one at a time");
63  std::vector<std::future<int> > results;
64  for(int i = 0; i < 30; ++i)
65  {
66  std::function<int()> fun = [=]() {usleep(1000000); return i*10; };
67  results.push_back(threadPool.pushJob(fun));
68  }
69 
70  for (std::future<int> & result : results) NRT_INFO("Result: " << result.get());
71  NRT_DEBUG("DONE");
72 
73  NRT_INFO("Testing groupAsync on our jobs...");
74  std::future<void> fut = nrt::groupAsync(funs);
75  fut.wait();
76  NRT_DEBUG("DONE");
77 
78  return 0;
79 }