前言
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、太仆寺網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、太仆寺網(wǎng)絡(luò)營(yíng)銷、太仆寺企業(yè)策劃、太仆寺品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供太仆寺建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:sd-ha.com
c++11在語(yǔ)言層面上提供了對(duì)thread的支持,由于不同的平臺(tái)提供了不同線程API,在語(yǔ)言層面提供了對(duì)thread的支持可以大大的減小代碼移植的工作量。
本文將給大家詳細(xì)介紹關(guān)于c++11封裝thread庫(kù)的相關(guān)內(nèi)容,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
基本接口要求
要求std::thread的構(gòu)造函數(shù)
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );
但是OS的庫(kù)函數(shù)定義為:
error_code create_thread((void_or_error_code(*entry)(void *), void *data);
主要是接口中的entry,本身使用void*根本沒帶類型信息,難點(diǎn)在于要做到模板暴露出類型從而可以通用化
void_or_error_code entry_point(void *arbitrary_data);
第一個(gè)問(wèn)題:把f和args統(tǒng)統(tǒng)打包在一起做成一個(gè)void *結(jié)構(gòu)
我們得從void* 中獲取函數(shù)指針和參數(shù)指針,首先來(lái)個(gè)結(jié)構(gòu)體定義真實(shí)指針類型
struct thread_data_base { virtual ~thread_data_base(){} virtual void run()=0; };
需要一個(gè)tuple,用于保存f和args,這樣我們就可以通過(guò)將void *data cast成thread_data_base *,然后調(diào)用其中的虛函數(shù)run來(lái)實(shí)際調(diào)用f(args…)
std::tuple<typename std::decay<F>::type, typename std::decay<ArgTypes>::type...> fp;
而entry函數(shù)實(shí)現(xiàn)效果大致如下,將結(jié)構(gòu)體包裝在該函數(shù)里面
void_or_error_code thread_entry(void *data) { std::unique_ptr<thread_data_base> p((thread_data_base *)data); p->run(); // return result of p->run() if error code is required }
第二個(gè)問(wèn)題:定義一個(gè)template,以適配不同類型的f和args
template<typename F, class... ArgTypes> class thread_data : public thread_data_base { public: thread_data(F&& f_, ArgTypes&&... args_): fp(std::forward<F>(f_), std::forward<ArgTypes>(args_)...) {} private: std::tuple<typename std::decay<F>::type, typename std::decay<ArgTypes>::type...> fp; }
在這個(gè)template里有一個(gè)data member正是那個(gè)關(guān)鍵的tuple,其類型需要使用traits進(jìn)行類型推理出來(lái)
第三個(gè)問(wèn)題:把任意的f和args包裝成一個(gè)thread_data_base *
定義創(chuàng)建函數(shù)可以將任意f和arg來(lái)創(chuàng)建一個(gè)void*結(jié)構(gòu)體,用來(lái)被entry函數(shù)調(diào)用
template<typename F, class... ArgTypes> inline thread_data_base *make_thread_data(F&& f, ArgTypes&&... args) { return new thread_data<typename std::remove_reference<F>::type, ArgTypes...>(std::forward<F>(f), std::forward<ArgTypes>(args)...); // 啥時(shí)候釋放? }
第四個(gè)問(wèn)題:如何處理Args…
難點(diǎn)在于如何通過(guò)一個(gè)f和args組成的tuple調(diào)用f(args…),使用get需要傳入一個(gè)編譯期常量
tp.get<0>()(tp.get<1>(), tp.get<2>(), tp.get<3>());
為了方便,我們想把數(shù)列當(dāng)前項(xiàng)直接放在參數(shù)列表里,要不然還需要在內(nèi)部找到數(shù)列的最后一項(xiàng)
template <std::size_t Ep, std::size_t Sp> struct make_tuple_indices {...};
為了生成數(shù)列[Sp, Ep),我們要做的就是從Sp開始,遞歸的在已有數(shù)列后面加一項(xiàng),直到滿足條件(Sp==Ep),下面就是最后定義的泛化,遞歸,終止條件
template <std::size_t Sp, class IntTuple, std::size_t Ep> struct make_indices_imp; template <std::size_t Sp, std::size_t... Indices, std::size_t Ep> struct make_indices_imp<Sp, tuple_indices<Indices...>, Ep> { typedef typename make_indices_imp<Sp+1, tuple_indices<Indices..., Sp>, Ep>::type type; }; template <std::size_t Ep, std::size_t... Indices> struct make_indices_imp<Ep, tuple_indices<Indices...>, Ep> { typedef tuple_indices<Indices...> type; }; template <std::size_t Ep, std::size_t Sp=0> struct make_tuple_indices { typedef typename make_indices_imp<Sp, tuple_indices<>, Ep>::type type; };
已經(jīng)有了run,之所以需要再定義一個(gè)run2,Indices是一個(gè)template type,只能用一個(gè)template function接收,所以我們需要把run和run2拆開,run作為繼承下來(lái)的虛函數(shù)做入口,run2接收Indices并用之前提到的方法調(diào)用f(args…)。
實(shí)際上thread_data_base接口就是實(shí)現(xiàn)了一個(gè)簡(jiǎn)化版的std::bind
靜態(tài)檢查工具:Clang thread safety annotations,添加安全注解:通過(guò)代碼注解告訴編譯器哪些成員變量和成員函數(shù)是受哪個(gè) mutex 保護(hù),防止遺漏線程安全的假設(shè)。用 GUARDED_BY 表明哪個(gè)成員變量是被哪個(gè) mutex 保護(hù)的
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。
分享標(biāo)題:c++11封裝thread庫(kù)的方法示例
瀏覽路徑:http://sd-ha.com/article44/jsjeee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、企業(yè)網(wǎng)站制作、做網(wǎng)站、網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)