Boost 多线程源代码解读

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

从这些代码可以看出,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

明显这里是一个对不同平台作出的定义,

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

水平有限....貌似停留在只能自己看懂....

你可能感兴趣的:(Boost 多线程源代码解读)