• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            陳碩的Blog

            muduo 與 libevent2 吞吐量對(duì)比

            libevent 是一款非常好用的 C 語(yǔ)言網(wǎng)絡(luò)庫(kù),它也采用 Reactor 模型,正好可以與 muduo 做一對(duì)比。

            本文用 ping pong 測(cè)試來(lái)對(duì)比 muduo 和 libevent2 的吞吐量,測(cè)試結(jié)果表明 muduo 吞吐量平均比 libevent2 高 18% 以上,個(gè)別情況達(dá)到 70%。

            測(cè)試對(duì)象

            測(cè)試環(huán)境與測(cè)試方法

            測(cè)試環(huán)境與前文《muduo 與 boost asio 吞吐量對(duì)比》相同。

            我自己編寫了 libevent2 的 ping pong 測(cè)試代碼,地址在 http://github.com/chenshuo/recipes/tree/master/pingpong/libevent/ 。由于這個(gè)測(cè)試代碼沒(méi)有使用多線程,所以本次測(cè)試只對(duì)比單線程下的性能。

            測(cè)試內(nèi)容為:客戶端與服務(wù)器運(yùn)行在同一臺(tái)機(jī)器,均為單線程,測(cè)試并發(fā)連接數(shù)為 1/10/100/1000/10000 時(shí)的吞吐量。

            在同一臺(tái)機(jī)器測(cè)試吞吐量的原因:

            • 現(xiàn)在的 CPU 很快,即便是單線程單 TCP 連接也能把 Gigabit 以太網(wǎng)的帶寬跑滿。如果用兩臺(tái)機(jī)器,所有的吞吐量測(cè)試結(jié)果都將是 100 MiB/s,失去了對(duì)比的意義。(或許可以對(duì)比哪個(gè)庫(kù)占的 CPU 少。)
            • 在同一臺(tái)機(jī)器上測(cè)試,可以在 CPU 資源相同的情況下,單純對(duì)比網(wǎng)絡(luò)庫(kù)的效率。也就是說(shuō)單線程下,服務(wù)端和客戶端各占滿 1 個(gè) CPU,比較哪個(gè)庫(kù)的吞吐量高。

            測(cè)試結(jié)果

            單線程吞吐量測(cè)試,數(shù)字越大越好:

            muduo_libevent_16k

            以上結(jié)果讓人大跌眼鏡,muduo 居然比 libevent 快 70%!跟蹤 libevent2 的源代碼發(fā)現(xiàn),它每次最多從 socket 讀取 4096 字節(jié)的數(shù)據(jù) (證據(jù)在 buffer.c 的 evbuffer_read() 函數(shù)),怪不得吞吐量比 muduo 小很多。因?yàn)樵谶@一測(cè)試中,muduo 每次讀取 16384 字節(jié),系統(tǒng)調(diào)用的性價(jià)比較高。

            buffer.c:#define EVBUFFER_MAX_READ      4096

            為了公平起見(jiàn),我再測(cè)了一次,這回兩個(gè)庫(kù)都發(fā)送 4096 字節(jié)的消息。

            muduo_libevent_4k

            測(cè)試結(jié)果表明 muduo 吞吐量平均比 libevent2 高 18% 以上。

            討論

            由于 libevent2 每次最多從網(wǎng)絡(luò)讀取 4096 字節(jié),大大限制了它的吞吐量。

            posted @ 2010-09-05 19:14 陳碩 閱讀(3496) | 評(píng)論 (3)編輯 收藏

            muduo 與 boost asio 吞吐量對(duì)比

            muduo (http://code.google.com/p/muduo) 是一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù),我在編寫它的時(shí)候并沒(méi)有以高并發(fā)高吞吐為主要目標(biāo),但出乎我的意料,ping pong 測(cè)試表明,muduo 吞吐量比 boost.asio 高 15% 以上。

            測(cè)試對(duì)象

            測(cè)試環(huán)境

            硬件:DELL 490 工作站,雙路 Intel quad core Xeon E5320 CPU,16G 內(nèi)存

            操作系統(tǒng):Ubuntu Linux Server 10.04.1 LTS x86_64

            編譯器:g++ 4.4.3

            測(cè)試方法

            依據(jù) asio 性能測(cè)試 http://think-async.com/Asio/LinuxPerformanceImprovements 的辦法,用 ping pong 協(xié)議來(lái)測(cè)試吞吐量。

            簡(jiǎn)單地說(shuō),ping pong 協(xié)議是客戶端和服務(wù)器都實(shí)現(xiàn) echo 協(xié)議。當(dāng) TCP 連接建立時(shí),客戶端向服務(wù)器發(fā)送一些數(shù)據(jù),服務(wù)器會(huì) echo 回這些數(shù)據(jù),然后客戶端再 echo 回服務(wù)器。這些數(shù)據(jù)就會(huì)像乒乓球一樣在客戶端和服務(wù)器之間來(lái)回傳送,直到有一方斷開連接為止。這是用來(lái)測(cè)試吞吐量的常用辦法。

            asio 的測(cè)試代碼取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。

            muduo 的測(cè)試代碼在 0.1.1 軟件包內(nèi),路徑為 examples/pingpong/,代碼如 http://gist.github.com/564985 所示。

            muduo 和 asio 的優(yōu)化編譯參數(shù)均為 -O2 -finline-limit=1000

            $ BUILD_TYPE=release ./build.sh  # 編譯 muduo 的優(yōu)化版本

            我主要做了兩項(xiàng)測(cè)試:

            • 單線程測(cè)試,測(cè)試并發(fā)連接數(shù)為 1/10/100/1000/10000 時(shí)的吞吐量。
            • 多線程測(cè)試,并發(fā)連接數(shù)為 100 或 1000,服務(wù)器和客戶端的線程數(shù)同時(shí)設(shè)為 1/2/3/4。(由于我家里只有一臺(tái) 8 核機(jī)器,而且服務(wù)器和客戶端運(yùn)行在同一臺(tái)機(jī)器上,線程數(shù)大于 4 沒(méi)有意義。)

            所有測(cè)試中,ping pong 消息的大小均為 16k bytes。測(cè)試用的 shell 腳本可從 http://gist.github.com/564985 下載。

            測(cè)試結(jié)果

            單線程測(cè)試的結(jié)果,數(shù)字越大越好:

            single_thread

            多線程測(cè)試的結(jié)果,數(shù)字越大越好:

            multiple_thread_100conn

            image007

            測(cè)試結(jié)果表明 muduo 吞吐量平均比 asio 高 15% 以上。

            討論

            muduo 出乎意料地比 asio 性能優(yōu)越,我想主要得益于其簡(jiǎn)單的設(shè)計(jì)和簡(jiǎn)潔的代碼。

            asio 在多線程測(cè)試中表現(xiàn)不佳,我猜測(cè)其主要原因是測(cè)試代碼只使用了一個(gè) io_service,如果改用“io_service per CPU”的話,性能應(yīng)該有所提高。我對(duì) asio 的了解程度僅限于能讀懂其代碼,希望能有 asio 高手編寫“io_service per CPU”的 ping pong 測(cè)試,以便與 muduo 做一個(gè)公平的比較。

            ping pong 測(cè)試很容易實(shí)現(xiàn),歡迎其他網(wǎng)絡(luò)庫(kù)(ACE、POCO、libevent 等)也能加入到對(duì)比中來(lái),期待這些庫(kù)的高手出馬。

            posted @ 2010-09-04 16:30 陳碩 閱讀(4847) | 評(píng)論 (5)編輯 收藏

            發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù)

            發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù)

            陳碩 (giantchen_AT_gmail)

            Blog.csdn.net/Solstice

            2010 Aug 30

            本文主要介紹 muduo 網(wǎng)絡(luò)庫(kù)的使用。其設(shè)計(jì)與實(shí)現(xiàn)將有另文講解。

            目錄

            由來(lái) 1

            下載與編譯 2

            例子 2

            基本結(jié)構(gòu) 3

            公開接口 4

            內(nèi)部實(shí)現(xiàn) 4

            線程模型 5

            結(jié)語(yǔ) 5

            由來(lái)

            半年前我寫了一篇《學(xué)之者生,用之者死——ACE歷史與簡(jiǎn)評(píng)》,其中提到“我心目中理想的網(wǎng)絡(luò)庫(kù)”的樣子:

            • 線程安全,支持多核多線程
            • 不考慮可移植性,不跨平臺(tái),只支持 Linux,不支持 Windows。
            • 在不增加復(fù)雜度的前提下可以支持 FreeBSD/Darwin,方便將來(lái)用 Mac 作為開發(fā)用機(jī),但不為它做性能優(yōu)化。也就是說(shuō) IO multiplexing 使用 poll 和 epoll。
            • 主要支持 x86-64,兼顧 IA32
            • 不支持 UDP,只支持 TCP
            • 不支持 IPv6,只支持 IPv4
            • 不考慮廣域網(wǎng)應(yīng)用,只考慮局域網(wǎng)
            • 只支持一種使用模式:non-blocking IO + one event loop per thread,不考慮阻塞 IO
            • API 簡(jiǎn)單易用,只暴露具體類和標(biāo)準(zhǔn)庫(kù)里的類,不使用 non-trivial templates,也不使用虛函數(shù)
            • 只滿足常用需求的 90%,不面面俱到,必要的時(shí)候以 app 來(lái)適應(yīng) lib
            • 只做 library,不做成 framework
            • 爭(zhēng)取全部代碼在 5000 行以內(nèi)(不含測(cè)試)
            • 以上條件都滿足時(shí),可以考慮搭配 Google Protocol Buffers RPC

            在想清楚這些目標(biāo)之后,我開始第三次嘗試編寫自己的 C++ 網(wǎng)絡(luò)庫(kù)。與前兩次不同,這次我一開始就想好了庫(kù)的名字,叫 muduo (木鐸),并在 Google code 上創(chuàng)建了項(xiàng)目: http://code.google.com/p/muduo/ 。muduo 的主體內(nèi)容在 5 月底已經(jīng)基本完成,現(xiàn)在我把它開源。

            本文主要介紹 muduo 網(wǎng)絡(luò)庫(kù)的使用,其設(shè)計(jì)與實(shí)現(xiàn)將有另文講解。

            下載與編譯

            下載地址: http://muduo.googlecode.com/files/muduo-0.1.0-alpha.tar.gz

            SHA1 Checksum: 5d3642e311177ded89ed0d15c10921738f8c984c

            Muduo 使用了 Linux 較新的系統(tǒng)調(diào)用,要求 Linux 的內(nèi)核版本大于 2.6.28 (我自己用的是 2.6.32 )。在 Debian Squeeze / Ubuntu 10.04 LTS 上編譯測(cè)試通過(guò),32 位和 64 位系統(tǒng)都能使用。

            Muduo 采用 CMake 為 build system,安裝方法:

            $ sudo apt-get install cmake

            Muduo 依賴 Boost,很容易安裝:

            $ sudo apt-get install libboost1.40-dev # 或 libboost1.42-dev

            編譯方法很簡(jiǎn)單:

            $ tar zxf muduo-0.1.0-alpha.tar.gz

            $ cd muduo/

            $ ./build.sh

            # 編譯生成的可執(zhí)行文件和靜態(tài)庫(kù)文件分別位于 ../build/debug/{bin,lib}

            如果要編譯 release 版,可執(zhí)行

            $ BUILD_TYPE=release ./build.sh

            # 編譯生成的可執(zhí)行文件和靜態(tài)庫(kù)文件分別位于 ../build/release/{bin,lib}

            編譯完成之后請(qǐng)?jiān)囘\(yùn)行其中的例子。比如 bin/inspector_test ,然后通過(guò)瀏覽器訪問(wèn) http://10.0.0.10:12345/ 或 http://10.0.0.10:12345/proc/status,其中 10.0.0.10 替換為你的 Linux box 的 IP。

            例子

            Muduo 附帶了幾十個(gè)小例子,位于 examples 目錄。其中包括從 Boost.Asio、JBoss Netty、Python Twisted 等處移植過(guò)來(lái)的例子。

            examples

            |-- simple # 簡(jiǎn)單網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)

            |   |-- allinone  # 在一個(gè)程序里同時(shí)實(shí)現(xiàn)下面 5 個(gè)協(xié)議

            |   |-- chargen   # RFC 864,可測(cè)試帶寬

            |   |-- daytime # RFC 867

            |   |-- discard # RFC 863

            |   |-- echo # RFC 862

            |   |-- time # RFC 868

            |   `-- timeclient # time 協(xié)議的客戶端

            |-- hub # 一個(gè)簡(jiǎn)單的 pub/sub/hub 服務(wù),演示應(yīng)用級(jí)的廣播

            |-- roundtrip # 測(cè)試兩臺(tái)機(jī)器的網(wǎng)絡(luò)延時(shí)與時(shí)間差

            |-- asio # 從 Boost.Asio 移植的例子

            |   |-- chat # 聊天服務(wù)

            |   `-- tutorial # 一系列 timers

            |-- netty # 從 JBoss Netty 移植的例子

            |   |-- discard # 可用于測(cè)試帶寬,服務(wù)器可多線程運(yùn)行

            |   |-- echo # 可用于測(cè)試帶寬,服務(wù)器可多線程運(yùn)行

            |   `-- uptime # TCP 長(zhǎng)連接

            `-- twisted # 從 Python Twisted 移植的例子

                `-- finger # finger01 ~ 07

            基本結(jié)構(gòu)

            Muduo 的目錄結(jié)構(gòu)如下。

            muduo

            |-- base # 與網(wǎng)絡(luò)無(wú)關(guān)的基礎(chǔ)代碼,已提前發(fā)布

            `-- net # 網(wǎng)絡(luò)庫(kù)

                |-- http # 一個(gè)簡(jiǎn)單的可嵌入的 web 服務(wù)器

                |-- inspect # 基于以上 web 服務(wù)器的“窺探器”,用于報(bào)告進(jìn)程的狀態(tài)

                `-- poller # poll(2) 和 epoll(4) 兩種 IO multiplexing 后端

            Muduo 是基于 Reactor 模式的網(wǎng)絡(luò)庫(kù),其核心是個(gè)事件循環(huán) EventLoop,用于響應(yīng)計(jì)時(shí)器和 IO 事件。Muduo 采用基于對(duì)象(object based)而非面向?qū)ο螅╫bject oriented)的設(shè)計(jì)風(fēng)格,其接口多以 boost::function + boost::bind 表達(dá)

            Muduo 的頭文件明確分為客戶可見(jiàn)和客戶不可見(jiàn)兩類。客戶可見(jiàn)的為白底,客戶不可見(jiàn)的為灰底。

            inc

            這里簡(jiǎn)單介紹各個(gè)頭文件及 class 的作用,詳細(xì)的介紹留給以后的博客。

            公開接口
            • Buffer 仿 Netty ChannelBuffer 的 buffer class,數(shù)據(jù)的讀寫透過(guò) buffer 進(jìn)行
            • InetAddress 封裝 IPv4 地址 (end point),注意,muduo 目前不能解析域名,只認(rèn) IP
            • EventLoop 反應(yīng)器 Reactor,用戶可以注冊(cè)計(jì)時(shí)器回調(diào)
            • EventLoopThread 啟動(dòng)一個(gè)線程,在其中運(yùn)行 EventLoop::loop()
            • TcpConnection 整個(gè)網(wǎng)絡(luò)庫(kù)的核心,封裝一次 TCP 連接
            • TcpClient 用于編寫網(wǎng)絡(luò)客戶端,能發(fā)起連接,并且有重試功能
            • TcpServer 用于編寫網(wǎng)絡(luò)服務(wù)器,接受客戶的連接
            • 在這些類中,TcpConnection 的生命期依靠 shared_ptr 控制(即用戶和庫(kù)共同控制)。Buffer 的生命期由 TcpConnection 控制。其余類的生命期由用戶控制。
            • HttpServer 和 Inspector,暴露出一個(gè) http 界面,用于監(jiān)控進(jìn)程的狀態(tài),類似于 Java JMX。這么做的原因是,《程序員修煉之道》第 6 章第 34 條提到“對(duì)于更大、更復(fù)雜的服務(wù)器代碼,提供其操作的內(nèi)部試圖的一種漂亮技術(shù)是使用內(nèi)建的 Web 服務(wù)器”,Jeff Dean 也說(shuō)“(每個(gè) Google 的服務(wù)器進(jìn)程)Export HTML-based status pages for easy diagnosis”。
            內(nèi)部實(shí)現(xiàn)
            • Channel 是 selectable IO channel,負(fù)責(zé)注冊(cè)與響應(yīng) IO 事件,它不擁有 file descriptor。它是 Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成員,生命期由后者控制。
            • Socket 封裝一個(gè) file descriptor,并在析構(gòu)時(shí)關(guān)閉 fd。它是 Acceptor、TcpConnection 的成員,生命期由后者控制。EventLoop、TimerQueue 也擁有 fd,但是不封裝為 Socket。
            • SocketsOps 封裝各種 sockets 系統(tǒng)調(diào)用。
            • EventLoop 封裝事件循環(huán),也是事件分派的中心。它用 eventfd(2) 來(lái)異步喚醒,這有別于傳統(tǒng)的用一對(duì) pipe(2) 的辦法。它用 TimerQueue 作為計(jì)時(shí)器管理,用 Poller 作為 IO Multiplexing。
            • Poller 是 PollPoller 和 EPollPoller 的基類,采用“電平觸發(fā)”的語(yǔ)意。它是 EventLoop 的成員,生命期由后者控制。
            • PollPoller 和 EPollPoller 封裝 poll(2) 和 epoll(4) 兩種 IO Multiplexing 后端。Poll 的存在價(jià)值是便于調(diào)試,因?yàn)?poll(2) 調(diào)用是上下文無(wú)關(guān)的,用 strace 很容易知道庫(kù)的行為是否正確。
            • Connector 用于發(fā)起 TCP 連接,它是 TcpClient 的成員,生命期由后者控制。
            • Acceptor 用于接受 TCP 連接,它是 TcpServer 的成員,生命期由后者控制。
            • TimerQueue 用 timerfd 實(shí)現(xiàn)定時(shí),這有別于傳統(tǒng)的設(shè)置 poll/epoll_wait 的等待時(shí)長(zhǎng)的辦法。為了簡(jiǎn)單起見(jiàn),目前用鏈表來(lái)管理 Timer,如果有必要可改為優(yōu)先隊(duì)列,這樣復(fù)雜度可從 O(n) 降為 O(ln n) (某些操作甚至是 O(1))。它是 EventLoop 的成員,生命期由后者控制。
            • EventLoopThreadPool 用于創(chuàng)建 IO 線程池,也就是說(shuō)把 TcpConnection 分派到一組運(yùn)行 EventLoop 的線程上。它是 TcpServer 的成員,生命期由后者控制。

            線程模型

            Muduo 的線程模型符合我主張的 one loop per thread + thread pool 模型。每個(gè)線程最多有一個(gè) EventLoop。每個(gè) TcpConnection 必須歸某個(gè) EventLoop 管理,所有的 IO 會(huì)轉(zhuǎn)移到這個(gè)線程,換句話說(shuō)一個(gè) file descriptor 只能由一個(gè)線程讀寫。TcpConnection 所在的線程由其所屬的 EventLoop 決定,這樣我們可以很方便地把不同的 TCP 連接放到不同的線程去,也可以把一些 TCP 連接放到一個(gè)線程里。TcpConnection 和 EventLoop 是線程安全的,可以跨線程調(diào)用。TcpServer 直接支持多線程,它有兩種模式:

            1. 單線程,accept 與 TcpConnection 用同一個(gè)線程做 IO。

            2. 多線程,accept 與 EventLoop 在同一個(gè)線程,另外創(chuàng)建一個(gè) EventLoopThreadPool,新到的連接會(huì)按 round-robin 方式分配到線程池中。

            結(jié)語(yǔ)

            Muduo 是我對(duì)常見(jiàn)網(wǎng)絡(luò)編程任務(wù)的總結(jié),用它我能很容易地編寫多線程的 TCP 服務(wù)器和客戶端。Muduo 是我業(yè)余時(shí)間的作品,代碼估計(jì)還有很多 bug,功能也不完善(例如不支持 signal 處理),待日后慢慢改進(jìn)吧。

            posted @ 2010-08-29 23:42 陳碩 閱讀(12080) | 評(píng)論 (20)編輯 收藏

            發(fā)布一個(gè) Linux 下的 C++ 多線程庫(kù)

            發(fā)布一個(gè)我自己業(yè)余時(shí)間編寫的 C++ 多線程庫(kù) for Linux,這個(gè)庫(kù)只有不到 1000 行源代碼,封裝了 pthreads 的常用功能(互斥器、條件變量、線程),實(shí)現(xiàn)了簡(jiǎn)單的線程池,并仿照 java concurrent 包編寫了 BlockingQueue 和 CountDownLatch。庫(kù)里的每個(gè) class 都提供了使用樣例。

            這個(gè)庫(kù)的內(nèi)容:

            • 整數(shù)的原子操作, AtomicInt32 和 AtomicInt64
            • 線程,Thread
            • 線程池,ThreadPool
            • 互斥器與條件變量, MutexLock,MutexLockGuard 與 Condition
            • 帶調(diào)用棧信息 (stack trace) 的異常基類,Exception
            • 仿 Java concurrent 的 BlockingQueue 和 CountDownLatch
            • Singleton 與 ThreadLocal

            注:我故意沒(méi)有提供信號(hào)量 Semaphore 的封裝。將來(lái)或許會(huì)增加讀寫鎖的封裝,如果我在博客中用到的話。

            Thread 和 ThreadPool 的接口設(shè)計(jì)采用了《以 boost::function 和 boost:bind 取代虛函數(shù)》里提倡的風(fēng)格,沒(méi)有使用繼承和基類。

            注意,CurrentThread 有一個(gè) thread local 變量 t_threadName,其作用是在調(diào)試和分析 core dump 時(shí)打印線程的名稱,例如:

            (gdb) p 'muduo::CurrentThread::t_threadName'
            $4 = 0x4057fe "ThreadPool2"

            MutexLock,MutexLockGuard 與 Condition 的使用請(qǐng)參考《多線程服務(wù)器的常用編程模型》。

            CountDownLatch 的使用樣例見(jiàn) test/BlockingQueue_test.cc

            git 下載地址: http://github.com/chenshuo/recipes

            瀏覽源代碼: http://github.com/chenshuo/recipes/tree/master/thread/

            這個(gè)庫(kù)在 Debian Squeeze 和 Ubuntu 10.04 LTS 下編譯測(cè)試通過(guò),適用于 x86 和 x86-64 平臺(tái)。

            posted @ 2010-08-21 23:47 陳碩 閱讀(9808) | 評(píng)論 (37)編輯 收藏

            整合 Google 開源 C++ 代碼

                 摘要: Google 開源了很多優(yōu)秀的 C++ 程序庫(kù),本文介紹如何將其中幾個(gè)整合到一起。
            本文涉及的 Google 庫(kù)有:
            gflags - 命令行參數(shù)解析。可以完全用命令行來(lái)配置應(yīng)用程序,省去配置文件。
            gtest - C++ 單元測(cè)試框架
            gmock - C++ 單元測(cè)試中用到的 mock
            glog - 日志庫(kù)
            protobuf - 高效的網(wǎng)絡(luò)協(xié)議格式
            還有第三方的 libunwind 和 zlib。  閱讀全文

            posted @ 2010-04-17 21:43 陳碩 閱讀(15125) | 評(píng)論 (9)編輯 收藏

            對(duì) C++ 歷史的個(gè)人觀點(diǎn)

                 摘要: C++ 語(yǔ)言設(shè)計(jì)的三大約束,歷史發(fā)展中的謊言與真相。  閱讀全文

            posted @ 2010-04-06 21:34 陳碩 閱讀(8470) | 評(píng)論 (25)編輯 收藏

            學(xué)之者生,用之者死——ACE歷史與簡(jiǎn)評(píng)

                 摘要: ACE 是現(xiàn)代面向?qū)ο缶W(wǎng)絡(luò)編程的鼻祖,確立了許多重要模式,如 Reactor、Acceptor 等,重要到我們甚至覺(jué)得網(wǎng)絡(luò)編程就應(yīng)該是那樣的。但為什么 ACE 叫好不叫座?大名鼎鼎卻使用者寥寥?本文談?wù)剰钠湔Q生背景、代碼質(zhì)量等方面談?wù)勎业膫€(gè)人觀點(diǎn)。  閱讀全文

            posted @ 2010-03-11 20:34 陳碩 閱讀(6696) | 評(píng)論 (4)編輯 收藏

            多線程服務(wù)器的常用編程模型

            本文主要講我個(gè)人在多線程開發(fā)方面的一些粗淺經(jīng)驗(yàn)。總結(jié)了一兩種常用的線程模型,歸納了進(jìn)程間通訊與線程同步的最佳實(shí)踐,以期用簡(jiǎn)單規(guī)范的方式開發(fā)多線程程序。萬(wàn)字長(zhǎng)文,慎入,有 PDF 版下載。

            本文 PDF 版下載: http://files.cppblog.com/Solstice/multithreaded_server.pdf


            posted @ 2010-02-12 16:51 陳碩 閱讀(4439) | 評(píng)論 (7)編輯 收藏

            當(dāng)析構(gòu)函數(shù)遇到多線程 —— C++ 中線程安全的對(duì)象回調(diào)

                 摘要: 編寫線程安全的類不是難事,用同步原語(yǔ)保護(hù)內(nèi)部狀態(tài)即可。但是對(duì)象的生與死不能由對(duì)象自身?yè)碛械幕コ馄鱽?lái)保護(hù)。如何保證即將析構(gòu)對(duì)象 x 的時(shí)候,不會(huì)有另一個(gè)線程正在調(diào)用 x 的成員函數(shù)?或者說(shuō),如何保證在執(zhí)行 x 的成員函數(shù)期間,對(duì)象 x 不會(huì)在另一個(gè)線程被析構(gòu)?如何避免這種競(jìng)態(tài)條件是 C++ 多線程編程面臨的基本問(wèn)題,可以借助 boost 的 shared_ptr 和 weak_ptr 完美解決。這也是實(shí)現(xiàn)線程安全的 Observer 模式的必備技術(shù)。全文 1 萬(wàn) 2 千余字,有 PDF 版下載。  閱讀全文

            posted @ 2010-01-28 08:13 陳碩 閱讀(7097) | 評(píng)論 (5)編輯 收藏

            僅列出標(biāo)題
            共6頁(yè): 1 2 3 4 5 6 
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類

            隨筆檔案

            相冊(cè)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品亚洲AV久久久无码| 久久精品人人做人人爽电影| 亚洲国产精品无码久久一线 | 久久亚洲日韩看片无码| 国产激情久久久久影院老熟女 | 久久er99热精品一区二区| 久久精品国产乱子伦| 精产国品久久一二三产区区别| 中文字幕久久亚洲一区| 性做久久久久久久久老女人| 日韩十八禁一区二区久久| 国内精品久久久久影院亚洲| 亚洲人成电影网站久久| 国产成人综合久久精品红| 久久久无码精品亚洲日韩京东传媒 | 久久久久久综合一区中文字幕 | 精品久久久久久无码中文野结衣| 久久久久免费精品国产 | 久久久久无码精品| 亚洲午夜精品久久久久久浪潮| 热RE99久久精品国产66热| 亚洲综合久久久| 欧美大香线蕉线伊人久久| 国产精品久久久天天影视| 国产精品久久久久久久午夜片| 国产亚洲精久久久久久无码AV| 日韩久久久久中文字幕人妻| 亚洲精品无码久久一线| 久久精品国产福利国产秒| 久久精品成人免费国产片小草| 伊人久久国产免费观看视频 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 东方aⅴ免费观看久久av| 久久99国产精品99久久| 性高湖久久久久久久久AAAAA| 久久久久久国产精品无码超碰| yellow中文字幕久久网| 亚洲日本va中文字幕久久| 久久国产免费| 久久无码av三级| 久久综合狠狠综合久久综合88 |