• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2014 Vicente Botet
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #define BOOST_THREAD_VERSION 4
7 
8 #include <iostream>
9 
10 #define BOOST_THREAD_PROVIDES_FUTURE
11 #define BOOST_THREAD_PROVIDES_EXECUTORS
12 #define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
13 
14 #if __cplusplus >= 201103L
15 #include <boost/thread/executors/loop_executor.hpp>
16 #include <boost/thread/executors/serial_executor.hpp>
17 #endif
18 #include <boost/thread/thread.hpp>
19 #include <boost/atomic.hpp>
20 
21 using namespace std;
22 
main()23 int main()
24 {
25 #if __cplusplus >= 201103L
26    static std::size_t const nWorks = 100000;
27    boost::atomic<unsigned> execCount(0u);
28    boost::loop_executor ex;
29 
30    boost::thread t([&ex]()
31    {
32       ex.loop();
33    });
34 
35    {
36      boost::serial_executor serial(ex);
37 
38       for (size_t i = 0; i < nWorks; i++)
39          serial.submit([i, &execCount] {
40              //std::cout << i << ".";
41              ++execCount;
42          });
43 
44       serial.close();
45    }
46    unsigned const cnt = execCount.load();
47    if (cnt != nWorks) {
48       // Since the serial_executor is closed, all work should have been done,
49       // even though the loop_executor ex is not.
50       std::cerr << "Only " << cnt << " of " << nWorks << " works executed!\n";
51       return 1;
52    }
53 
54    if (ex.try_executing_one()) {
55       std::cerr
56          << "loop_executor::try_executing_one suceeded on closed executor!\n";
57       return 1;
58    }
59 
60    ex.close();
61 
62    t.join();
63    std::cout << "end\n" << std::endl;
64 #endif
65    return 0;
66 }
67