Boost 多线程源代码解读
Boost 类库是个开源的类库,传说中的准标准库这下将会是我阅读Boost 多线程源代码的心得.
费话少说,在使用BOOST的多线程我们都会引入boost/thread.hpp这一个文件好我们先找到这个文件将它打开
1
//
Copyright (C) 2001-2003
2 // William E. Kempf
3 // (C) Copyright 2008 Anthony Williams
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt )
7
8 // See www.boost.org/libs/thread for documentation.
9
10 #if !defined(BOOST_THREAD_WEK01082003_HPP)
11 #define BOOST_THREAD_WEK01082003_HPP
12
13 #include < boost / thread / thread.hpp >
14 #include < boost / thread / condition_variable.hpp >
15 #include < boost / thread / exceptions.hpp >
16 #include < boost / thread / mutex.hpp >
17 #include < boost / thread / once.hpp >
18 #include < boost / thread / recursive_mutex.hpp >
19 #include < boost / thread / tss.hpp >
20 #include < boost / thread / thread_time.hpp >
21 #include < boost / thread / locks.hpp >
22 #include < boost / thread / shared_mutex.hpp >
23 #include < boost / thread / barrier.hpp >
24
25 #endif
2 // William E. Kempf
3 // (C) Copyright 2008 Anthony Williams
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt )
7
8 // See www.boost.org/libs/thread for documentation.
9
10 #if !defined(BOOST_THREAD_WEK01082003_HPP)
11 #define BOOST_THREAD_WEK01082003_HPP
12
13 #include < boost / thread / thread.hpp >
14 #include < boost / thread / condition_variable.hpp >
15 #include < boost / thread / exceptions.hpp >
16 #include < boost / thread / mutex.hpp >
17 #include < boost / thread / once.hpp >
18 #include < boost / thread / recursive_mutex.hpp >
19 #include < boost / thread / tss.hpp >
20 #include < boost / thread / thread_time.hpp >
21 #include < boost / thread / locks.hpp >
22 #include < boost / thread / shared_mutex.hpp >
23 #include < boost / thread / barrier.hpp >
24
25 #endif
从这些代码可以看出,boost/thread.hpp只是引用文件而已,看不到任何世界的C++代码,
我们顺着这些#include一个一个打开
先是#include <boost/thread/thread.hpp>
1
#ifndef BOOST_THREAD_THREAD_HPP
2 #define BOOST_THREAD_THREAD_HPP
3
4 // thread.hpp
5 //
6 // (C) Copyright 2007-8 Anthony Williams
7 //
8 // Distributed under the Boost Software License, Version 1.0. (See
9 // accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt )
11
12 #include < boost / thread / detail / platform.hpp >
13
14 #if defined(BOOST_THREAD_PLATFORM_WIN32)
15 #include < boost / thread / win32 / thread_data.hpp >
16 #elif defined(BOOST_THREAD_PLATFORM_PTHREAD)
17 #include < boost / thread / pthread / thread_data.hpp >
18 #else
19 #error "Boost threads unavailable on this platform"
20 #endif
21
22 #include < boost / thread / detail / thread.hpp >
23
24
25 #endif
26
2 #define BOOST_THREAD_THREAD_HPP
3
4 // thread.hpp
5 //
6 // (C) Copyright 2007-8 Anthony Williams
7 //
8 // Distributed under the Boost Software License, Version 1.0. (See
9 // accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt )
11
12 #include < boost / thread / detail / platform.hpp >
13
14 #if defined(BOOST_THREAD_PLATFORM_WIN32)
15 #include < boost / thread / win32 / thread_data.hpp >
16 #elif defined(BOOST_THREAD_PLATFORM_PTHREAD)
17 #include < boost / thread / pthread / thread_data.hpp >
18 #else
19 #error "Boost threads unavailable on this platform"
20 #endif
21
22 #include < boost / thread / detail / thread.hpp >
23
24
25 #endif
26
明显这里是一个对不同平台作出的定义,
boost / thread / detail /是一个基本由宏定义组成的HPP文件,我们站且跳过
我们以WIN32入手...
#include <boost/thread/win32/thread_data.hpp>
1
#ifndef BOOST_THREAD_PTHREAD_THREAD_DATA_HPP
2 #define BOOST_THREAD_PTHREAD_THREAD_DATA_HPP
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt )
6 // (C) Copyright 2007 Anthony Williams
7
8 #include < boost / thread / detail / config.hpp >
9 #include < boost / thread / exceptions.hpp >
10 #include < boost / shared_ptr.hpp >
11 #include < boost / enable_shared_from_this.hpp >
12 #include < boost / thread / mutex.hpp >
13 #include < boost / optional.hpp >
14 #include < pthread.h >
15 #include " condition_variable_fwd.hpp "
16
17 #include < boost / config / abi_prefix.hpp >
18
19 namespace boost
20 {
21 class thread;
22
23 namespace detail
24 {
25 struct thread_exit_callback_node;
26 struct tss_data_node;
27
28 struct thread_data_base;
29 typedef boost::shared_ptr<thread_data_base> thread_data_ptr;
30
31 struct BOOST_THREAD_DECL thread_data_base:
32 enable_shared_from_this<thread_data_base>
33 {
34 thread_data_ptr self;
35 pthread_t thread_handle;
36 boost::mutex data_mutex;
37 boost::condition_variable done_condition;
38 boost::mutex sleep_mutex;
39 boost::condition_variable sleep_condition;
40 bool done;
41 bool join_started;
42 bool joined;
43 boost::detail::thread_exit_callback_node* thread_exit_callbacks;
44 boost::detail::tss_data_node* tss_data;
45 bool interrupt_enabled;
46 bool interrupt_requested;
47 pthread_cond_t* current_cond;
48
49 thread_data_base():
50 done(false),join_started(false),joined(false),
51 thread_exit_callbacks(0),tss_data(0),
52 interrupt_enabled(true),
53 interrupt_requested(false),
54 current_cond(0)
55 {}
56 virtual ~thread_data_base();
57
58 typedef pthread_t native_handle_type;
59
60 virtual void run()=0;
61 };
62
63 BOOST_THREAD_DECL thread_data_base* get_current_thread_data();
64
65 class interruption_checker
66 {
67 thread_data_base* const thread_info;
68
69 void check_for_interruption()
70 {
71 if(thread_info->interrupt_requested)
72 {
73 thread_info->interrupt_requested=false;
74 throw thread_interrupted();
75 }
76 }
77
78 void operator=(interruption_checker&);
79 public:
80 explicit interruption_checker(pthread_cond_t* cond):
81 thread_info(detail::get_current_thread_data())
82 {
83 if(thread_info && thread_info->interrupt_enabled)
84 {
85 lock_guard<mutex> guard(thread_info->data_mutex);
86 check_for_interruption();
87 thread_info->current_cond=cond;
88 }
89 }
90 ~interruption_checker()
91 {
92 if(thread_info && thread_info->interrupt_enabled)
93 {
94 lock_guard<mutex> guard(thread_info->data_mutex);
95 thread_info->current_cond=NULL;
96 check_for_interruption();
97 }
98 }
99 };
100 }
101
102 namespace this_thread
103 {
104 void BOOST_THREAD_DECL yield();
105
106 void BOOST_THREAD_DECL sleep(system_time const& abs_time);
107
108 template<typename TimeDuration>
109 inline void sleep(TimeDuration const& rel_time)
110 {
111 this_thread::sleep(get_system_time()+rel_time);
112 }
113 }
114}
115
116 #include < boost / config / abi_suffix.hpp >
117
118 #endif
2 #define BOOST_THREAD_PTHREAD_THREAD_DATA_HPP
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt )
6 // (C) Copyright 2007 Anthony Williams
7
8 #include < boost / thread / detail / config.hpp >
9 #include < boost / thread / exceptions.hpp >
10 #include < boost / shared_ptr.hpp >
11 #include < boost / enable_shared_from_this.hpp >
12 #include < boost / thread / mutex.hpp >
13 #include < boost / optional.hpp >
14 #include < pthread.h >
15 #include " condition_variable_fwd.hpp "
16
17 #include < boost / config / abi_prefix.hpp >
18
19 namespace boost
20 {
21 class thread;
22
23 namespace detail
24 {
25 struct thread_exit_callback_node;
26 struct tss_data_node;
27
28 struct thread_data_base;
29 typedef boost::shared_ptr<thread_data_base> thread_data_ptr;
30
31 struct BOOST_THREAD_DECL thread_data_base:
32 enable_shared_from_this<thread_data_base>
33 {
34 thread_data_ptr self;
35 pthread_t thread_handle;
36 boost::mutex data_mutex;
37 boost::condition_variable done_condition;
38 boost::mutex sleep_mutex;
39 boost::condition_variable sleep_condition;
40 bool done;
41 bool join_started;
42 bool joined;
43 boost::detail::thread_exit_callback_node* thread_exit_callbacks;
44 boost::detail::tss_data_node* tss_data;
45 bool interrupt_enabled;
46 bool interrupt_requested;
47 pthread_cond_t* current_cond;
48
49 thread_data_base():
50 done(false),join_started(false),joined(false),
51 thread_exit_callbacks(0),tss_data(0),
52 interrupt_enabled(true),
53 interrupt_requested(false),
54 current_cond(0)
55 {}
56 virtual ~thread_data_base();
57
58 typedef pthread_t native_handle_type;
59
60 virtual void run()=0;
61 };
62
63 BOOST_THREAD_DECL thread_data_base* get_current_thread_data();
64
65 class interruption_checker
66 {
67 thread_data_base* const thread_info;
68
69 void check_for_interruption()
70 {
71 if(thread_info->interrupt_requested)
72 {
73 thread_info->interrupt_requested=false;
74 throw thread_interrupted();
75 }
76 }
77
78 void operator=(interruption_checker&);
79 public:
80 explicit interruption_checker(pthread_cond_t* cond):
81 thread_info(detail::get_current_thread_data())
82 {
83 if(thread_info && thread_info->interrupt_enabled)
84 {
85 lock_guard<mutex> guard(thread_info->data_mutex);
86 check_for_interruption();
87 thread_info->current_cond=cond;
88 }
89 }
90 ~interruption_checker()
91 {
92 if(thread_info && thread_info->interrupt_enabled)
93 {
94 lock_guard<mutex> guard(thread_info->data_mutex);
95 thread_info->current_cond=NULL;
96 check_for_interruption();
97 }
98 }
99 };
100 }
101
102 namespace this_thread
103 {
104 void BOOST_THREAD_DECL yield();
105
106 void BOOST_THREAD_DECL sleep(system_time const& abs_time);
107
108 template<typename TimeDuration>
109 inline void sleep(TimeDuration const& rel_time)
110 {
111 this_thread::sleep(get_system_time()+rel_time);
112 }
113 }
114}
115
116 #include < boost / config / abi_suffix.hpp >
117
118 #endif
水平有限....貌似停留在只能自己看懂....