新聞中心
程序開發(fā)過程中,經(jīng)常會面對各種各樣的需求場景,如果采用單線程的處理方式,那么是很難滿足要求,所以,需要采用多線程的方式來處理,而這就涉及到啟動線程的方式。

目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、網(wǎng)站托管運營、企業(yè)網(wǎng)站設計、望城網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
本文將首先說明啟動線程的五種方式,然后再分析五種方式的優(yōu)缺點,最后通過一個示例來說明如何將線程運用到實際的場景中,并總結五種啟動線程的特性。
一、函數(shù)指針方式
函數(shù)指針方式啟動線程是最原始、最基礎的方式。定義實現(xiàn)線程的處理函數(shù)ThreadFunction,然后啟動線程的時候,將函數(shù)指針傳達給線程類的構造函數(shù)。
啟動線程之后,打印了如下信息,說明線程啟動之后,調用了線程處理函數(shù)。
二、函數(shù)對象方式
第二種啟動線程的方式是采用函數(shù)對象的形式,首先創(chuàng)建類ThreadOpeartor,然后該類重載operator()運算符,最后以仿函數(shù)的形式作為線程的參數(shù)傳遞給線程來啟動。
同樣的,運行程序之后,串口上可以查看到如下信息,說明函數(shù)對象方式啟動線程是生效的。
三、lambda方式
第三種啟動線程的方式是lambda函數(shù)形式,lambda函數(shù)即匿名函數(shù),它作為線程的參數(shù)來啟動線程。
編譯運行程序之后,也可以確認線程啟動的時候,調用了lambda函數(shù)。
四、類函數(shù)指針方式
第四種啟動線程的方式是類函數(shù)指針形式,先在類成員之中定義類成員函數(shù),然后以函數(shù)指針作為參數(shù)來啟動線程。
從運行結果看,啟動的線程成功調用了類的成員函數(shù)。
五、std::bind方式
第五種啟動線程的方式是stb::bind形式, 首先是類成員函數(shù)作為stb::bind的參數(shù), 然后stb::bind再作為線程參數(shù)來啟動線程。
編譯成功之后,運行程序的結果如下,這也說明std::bind方式啟動線程是可行的。
六、啟動方式優(yōu)缺點
函數(shù)指針啟動線程的方式是一種比較老的方式,linux系統(tǒng)中pthread庫是支持的,是屬于面向過程的思想,如果使用的系統(tǒng)不支持C++11, 那么可以采用這種方式。
函數(shù)對象啟動線程的方式可以在類內(nèi)部定義更多的細節(jié),比如定義成員變量,將更多的邏輯處理細節(jié)進行封裝。
lambda函數(shù)啟動線程的方式是代碼比較簡潔,由于函數(shù)是內(nèi)嵌形式,可讀性也比較好,它適用于線程處理函數(shù)的邏輯不是很復雜的場景。
類函數(shù)指針啟動線程的方式,線程的處理函數(shù)是屬于類,所以需要注意其生命周期。
std::bind啟動線程的方式,它可以與std::function結合起來,實現(xiàn)函數(shù)回調功能。
七、線程應用場景
本節(jié)將采用函數(shù)對象的形式啟動線程,說明如何應用到實際的應用中。
假設有不同的命令,需要在線程中執(zhí)行,首先實現(xiàn)命令基類
然后創(chuàng)建執(zhí)行命令類JWorkThread, 并重載operator() 運算符, 并且內(nèi)部執(zhí)行命令。
接著現(xiàn)在有一個類JRunCmd繼承基類JCommand,則調用方式如下所示
八、總結
本文主要說明了五種啟動線程的方式,并且說明了其特點,最后舉了一個線程應用的場景。但是,實際使用過程中,需要結合具體的場景來使用對應的線程啟動方式。
- 函數(shù)指針方式:定義普通函數(shù)
- 函數(shù)對象方式:重載operator()運算符
- Lambda函數(shù)方式:匿名函數(shù)
- 類函數(shù)指針的方式:對象函數(shù)指針
- std::bind的方式: 實際上也是對象函數(shù)指針
名稱欄目:基于C++11,介紹啟動線程的五種方式
轉載來源:http://fisionsoft.com.cn/article/cdghggi.html


咨詢
建站咨詢
