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#include <boost/config.hpp>
7#if ! defined BOOST_NO_CXX11_DECLTYPE
8#define BOOST_RESULT_OF_USE_DECLTYPE
9#endif
10
11#define BOOST_THREAD_VERSION 5
12#define BOOST_THREAD_USES_LOG_THREAD_ID
13
14#include <boost/thread/caller_context.hpp>
15#include <boost/thread/executors/basic_thread_pool.hpp>
16#include <boost/thread/executors/generic_executor_ref.hpp>
17#include <boost/smart_ptr/shared_ptr.hpp>
18#include <boost/smart_ptr/make_shared.hpp>
19#include <string>
20#include <iostream>
21
22#include <boost/thread/caller_context.hpp>
23
24struct current_executor_state_type {
25 boost::shared_ptr<boost::generic_executor_ref> current_executor_ptr;
26
27 template <class Executor>
28 void set_current_executor(Executor& ex)
29 {
30 current_executor_ptr = boost::make_shared<boost::generic_executor_ref>(ex);
31 }
32 boost::generic_executor_ref current_executor()
33 {
34 if (current_executor_ptr)
35 return *current_executor_ptr;
36 else
37 throw "";
38 }
39};
40
41thread_local current_executor_state_type current_executor_state;
42
43boost::generic_executor_ref current_executor()
44{
45 return current_executor_state.current_executor();
46}
47
48void p2()
49{
50 std::cout << BOOST_CONTEXTOF << std::endl;
51 boost::this_thread::sleep_for(d: boost::chrono::milliseconds(200));
52 std::cout << BOOST_CONTEXTOF << std::endl;
53}
54
55
56void p1()
57{
58 std::cout << BOOST_CONTEXTOF << std::endl;
59 boost::this_thread::sleep_for(d: boost::chrono::milliseconds(200));
60 current_executor().submit(closure: &p2);
61 boost::this_thread::sleep_for(d: boost::chrono::milliseconds(400));
62 std::cout << BOOST_CONTEXTOF << std::endl;
63}
64
65int main()
66{
67 std::cout << BOOST_CONTEXTOF << std::endl;
68
69 boost::basic_thread_pool tp(4,
70 // at_thread_entry
71 [](boost::basic_thread_pool& pool)
72 {
73 current_executor_state.set_current_executor(pool);
74 }
75 );
76
77 tp.submit(closure: &p1);
78
79 boost::this_thread::sleep_for(d: boost::chrono::seconds(5));
80
81 std::cout << BOOST_CONTEXTOF << std::endl;
82
83 return 1;
84
85}
86

source code of boost/libs/thread/example/this_executor.cpp