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
水平有限....貌似停留在只能自己看懂....
posted on 2009-05-09 20:43
^喬喬^ 閱讀(1960)
評論(1) 編輯 收藏 引用 所屬分類:
c++