基于C++11,介紹啟動線程的五種方式
程序開發過程中,經常會面對各種各樣的需求場景,如果采用單線程的處理方式,那么是很難滿足要求,所以,需要采用多線程的方式來處理,而這就涉及到啟動線程的方式。 本文將首先說明啟動線程的五種方式,然后再分析五種方式的優缺點,最后通過一個示例來說明如何將線程運用到實際的場景中,并總結五種啟動線程的特性。
函數指針方式啟動線程是最原始、最基礎的方式。定義實現線程的處理函數ThreadFunction,然后啟動線程的時候,將函數指針傳達給線程類的構造函數。 啟動線程之后,打印了如下信息,說明線程啟動之后,調用了線程處理函數。 第二種啟動線程的方式是采用函數對象的形式,首先創建類ThreadOpeartor,然后該類重載operator()運算符,最后以仿函數的形式作為線程的參數傳遞給線程來啟動。 同樣的,運行程序之后,串口上可以查看到如下信息,說明函數對象方式啟動線程是生效的。 第三種啟動線程的方式是lambda函數形式,lambda函數即匿名函數,它作為線程的參數來啟動線程。 編譯運行程序之后,也可以確認線程啟動的時候,調用了lambda函數。 第四種啟動線程的方式是類函數指針形式,先在類成員之中定義類成員函數,然后以函數指針作為參數來啟動線程。 從運行結果看,啟動的線程成功調用了類的成員函數。 第五種啟動線程的方式是stb::bind形式, 首先是類成員函數作為stb::bind的參數, 然后stb::bind再作為線程參數來啟動線程。 編譯成功之后,運行程序的結果如下,這也說明std::bind方式啟動線程是可行的。 函數指針啟動線程的方式是一種比較老的方式,linux系統中pthread庫是支持的,是屬于面向過程的思想,如果使用的系統不支持C++11, 那么可以采用這種方式。 函數對象啟動線程的方式可以在類內部定義更多的細節,比如定義成員變量,將更多的邏輯處理細節進行封裝。 lambda函數啟動線程的方式是代碼比較簡潔,由于函數是內嵌形式,可讀性也比較好,它適用于線程處理函數的邏輯不是很復雜的場景。 類函數指針啟動線程的方式,線程的處理函數是屬于類,所以需要注意其生命周期。 std::bind啟動線程的方式,它可以與std::function結合起來,實現函數回調功能。 本節將采用函數對象的形式啟動線程,說明如何應用到實際的應用中。 假設有不同的命令,需要在線程中執行,首先實現命令基類 然后創建執行命令類JWorkThread, 并重載operator() 運算符, 并且內部執行命令。 接著現在有一個類JRunCmd繼承基類JCommand,則調用方式如下所示 本文主要說明了五種啟動線程的方式,并且說明了其特點,最后舉了一個線程應用的場景。但是,實際使用過程中,需要結合具體的場景來使用對應的線程啟動方式。一、函數指針方式
二、函數對象方式
三、lambda方式
四、類函數指針方式
五、std::bind方式
六、啟動方式優缺點
七、線程應用場景
八、總結