資源描述:
《多線程類庫的設(shè)計與實現(xiàn)doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、多線程類庫的設(shè)計與實現(xiàn)引言很多書都會告訴你那些概念是什么,然而只有很少的書會告訴你具體該怎么做。對于很多人來說,包括我,有時候掌握“該怎么做”要比了解“那是什么”要難得多。一方面,名詞解釋很少會出錯,而且做起來很輕松,而要具體執(zhí)行的話就立刻涉及到價值觀和方法論的問題,這些都比較難于統(tǒng)一,容易引起異議。另一方面,就我個人經(jīng)驗而言,很多人只會解釋“那是什么”,而根本不懂“該怎么做”。所以,我們打算逆流而上,基本上不去說“那是什么”,除非有相當(dāng)?shù)谋匾?。中心?nèi)容是著手“該怎么做”。這個實踐系列可以說是筆者積累的一些心得,當(dāng)然,不可避免的要涉及到個人的價值觀和方法論問
2、題,不可避免的會產(chǎn)生異議。不過那又怎樣呢,難道這個世界就不允許有異議嗎。實際上,我個人并不排斥異議,相反的,我倒認為沒有異議的氛圍要么是可怕的,要么是病態(tài)的。目標(biāo):用C++設(shè)計一個簡單、實用、便于移植的線程類先說第一條,簡單,這里指模型簡單,機制簡單。我們都知道線程是現(xiàn)代操作系統(tǒng)的基本概念之一,當(dāng)然定義有很多種了,我們這里隨便列一個:(Athreadis)Asequenceofinstructionswhichmayexecuteinparallelwithotherthreads.這個定義是從Wiki上拷過來的,中文直譯就是:(線程)是可以和其他線程并行執(zhí)
3、行的指令序列。這個定義是遞歸的,一般來說遞歸定義用來定義比較基本的概念,因為很難再往下分割了。為了明確起見,我們再為上面的定義加一些限制,讓它成為下面的樣子:1.線程是若干計算機指令序列的集合;2.線程可以和其他線程并行執(zhí)行;3.屬于同一個進程的若干個線程可以共享地址空間。第3條又帶出另一個概念“進程”,這里就不再解釋了。很多操作系統(tǒng)中有所謂線程的同步通信和異步通信機制。我們只使用同步通信機制。這么做有兩個好處,一是可以使我們的線程模型盡量簡單,二是可以回避操作系統(tǒng)相關(guān)性,因為同步機制比較簡單,大多數(shù)操作系統(tǒng)的實現(xiàn)相互都很類似,而異步通信機制差別就很大了。我
4、們再來說實用。這里的實用是指實用主義,亦即為了減少成本(編碼量)、提高效益(開發(fā)速度)而舍棄一些“本來應(yīng)該有”的特性。比如說,我們不打算設(shè)計多層次的類,也不打算設(shè)計抽象類,而只打算設(shè)計一個可以簡單使用的線程類。相反的,很多線程庫,包括ZThread,將線程模型抽象分化,封裝到多個層次的類里面。我們不是說這樣的方針不好,這里只是想強調(diào)我們的方針是實用主義。最后一條是關(guān)于移植性。我們希望這個線程類可以不加修改就應(yīng)用于Windows32位系統(tǒng)和支持PosixThread線程的Linux/Unix系統(tǒng)。其他。接下來我們來看看開發(fā)環(huán)境。我們要考慮同時支持Win32和L
5、inux系統(tǒng)。Windows上使用Microsoft?VisualC++2005Express,因這個軟件包具有免費的許可協(xié)議,不需要花錢。Linux上使用g++(gcc)3.4.4,更高的版本應(yīng)該也沒有問題,使用這個版本是為了和某些cygwin版本兼容。當(dāng)然,GNU流都是免費的。背景:C++與多線程這個系列的主要內(nèi)容是介紹怎樣用C++語言設(shè)計與實現(xiàn)一個多線程類庫。盡管多線程在現(xiàn)代主流操作系統(tǒng)中早已不是什么新鮮概念,多線程設(shè)計與開發(fā)也已經(jīng)成為軟件開發(fā)的流行模式,但是目前為止,C++語言規(guī)范本身并沒有明確支持多線程程序設(shè)計。根據(jù)目前最新的C++語言標(biāo)準(zhǔn)《ISO
6、/IEC14882:2003ProgrammingLanguageC++》,通篇只有一個地方出現(xiàn)"thread"這個字眼:Whenanexceptionisthrown,controlistransferredtothenearesthandlerwithamatchingtype(15.3);“nearest”meansthehandlerforwhichthecompound-statement,ctor-initializer,orfunction-bodyfollowingthetrykeywordwasmostrecentlyenteredbyth
7、ethreadofcontrolandnotyetexited.(筆者譯文:當(dāng)一個異常被拋出時,(程序)控制被轉(zhuǎn)交到最近的具有匹配類型的異??刂茐K。“最近”是指距離關(guān)鍵字try最近的并且與該控制同屬一個尚未退出的線程的,一個復(fù)合代碼斷,或者構(gòu)造函數(shù)的初始化符(即構(gòu)造函數(shù)的成員初始化列表),或者一個函數(shù)體。)這是標(biāo)準(zhǔn)中唯一一次提到線程這個概念,意思大致是說C++異常控制是線程單位分開的??梢奀++委員會并非是沒有意識到線程概念的存在,而只是有意回避它。因為C++是一個標(biāo)準(zhǔn)的編程語言,獨立于各種操作系統(tǒng)平臺。線程是與操作系統(tǒng)具體實現(xiàn)密切相關(guān)的事物,C++語言中本
8、身去支持線程是不合適的。只是在異常處理的定義中實在繞