最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++11封裝thread庫的方法示例

 更新時間:2019年01月29日 11:21:20   作者:chaozh.com  
C++11 ,封裝了thread的多線程的類,這樣對多線程的使用更加方便。下面這篇文章主要給大家介紹了關(guān)于c++11封裝thread庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

c++11在語言層面上提供了對thread的支持,由于不同的平臺提供了不同線程API,在語言層面提供了對thread的支持可以大大的減小代碼移植的工作量。

本文將給大家詳細(xì)介紹關(guān)于c++11封裝thread庫的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧

基本接口要求

要求std::thread的構(gòu)造函數(shù)

template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );

但是OS的庫函數(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);

第一個問題:把f和args統(tǒng)統(tǒng)打包在一起做成一個void *結(jié)構(gòu)

我們得從void* 中獲取函數(shù)指針和參數(shù)指針,首先來個結(jié)構(gòu)體定義真實(shí)指針類型

struct thread_data_base
{
 virtual ~thread_data_base(){}
 virtual void run()=0;
};

需要一個tuple,用于保存f和args,這樣我們就可以通過將void *data cast成thread_data_base *,然后調(diào)用其中的虛函數(shù)run來實(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
}

第二個問題:定義一個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;
}

在這個template里有一個data member正是那個關(guān)鍵的tuple,其類型需要使用traits進(jìn)行類型推理出來

第三個問題:把任意的f和args包裝成一個thread_data_base *

定義創(chuàng)建函數(shù)可以將任意f和arg來創(chuàng)建一個void*結(jié)構(gòu)體,用來被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)...); // 啥時候釋放?
}

第四個問題:如何處理Args…

難點(diǎn)在于如何通過一個f和args組成的tuple調(diào)用f(args…),使用get需要傳入一個編譯期常量

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,之所以需要再定義一個run2,Indices是一個template type,只能用一個template function接收,所以我們需要把run和run2拆開,run作為繼承下來的虛函數(shù)做入口,run2接收Indices并用之前提到的方法調(diào)用f(args…)。

實(shí)際上thread_data_base接口就是實(shí)現(xiàn)了一個簡化版的std::bind

靜態(tài)檢查工具:Clang thread safety annotations,添加安全注解:通過代碼注解告訴編譯器哪些成員變量和成員函數(shù)是受哪個 mutex 保護(hù),防止遺漏線程安全的假設(shè)。用 GUARDED_BY 表明哪個成員變量是被哪個 mutex 保護(hù)的

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C語言中的奇技淫巧

    C語言中的奇技淫巧

    學(xué)習(xí)C語言的過程中,總會遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡單幾行的遞歸就實(shí)現(xiàn)的功能。下面我就總結(jié)幾個C語言中 比較新手向的代碼。讓你有一種woc!還能這么寫的想法
    2018-08-08
  • C++深入刨析muduo中的抽象類Poller

    C++深入刨析muduo中的抽象類Poller

    muduo網(wǎng)絡(luò)庫中Poller類是一個抽象類,用戶使用PollPoller或者EPollPoller類,下面跟隨小編一起來詳細(xì)了解一下
    2022-04-04
  • c++11中std::move函數(shù)的使用

    c++11中std::move函數(shù)的使用

    本文主要介紹了c++11中std::move函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++ SOCKET多線程實(shí)現(xiàn)聊天小程序

    C++ SOCKET多線程實(shí)現(xiàn)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了C++ SOCKET多線程實(shí)現(xiàn)聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言代碼中調(diào)用C++代碼的方法示例

    C語言代碼中調(diào)用C++代碼的方法示例

    這篇文章主要介紹了C語言代碼中調(diào)用C++代碼的方法示例,文中也介紹了C++代碼調(diào)用C代碼的方法,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • QT實(shí)現(xiàn)制作一個ListView列表的示例代碼

    QT實(shí)現(xiàn)制作一個ListView列表的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt制作一個ListView,點(diǎn)擊ListView的Item可以用于測試OpenCV的各種效果,感興趣的小伙伴可以了解一下
    2023-02-02
  • C++動態(tài)規(guī)劃算法實(shí)現(xiàn)矩陣鏈乘法

    C++動態(tài)規(guī)劃算法實(shí)現(xiàn)矩陣鏈乘法

    動態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問題。在這類問題中,可能會有許多可行解。每一個解都對應(yīng)于一個值,我們希望找到具有最優(yōu)值的解
    2022-06-06
  • C語言菜鳥基礎(chǔ)教程之Hello World

    C語言菜鳥基礎(chǔ)教程之Hello World

    C語言是一門通用計(jì)算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。
    2017-10-10
  • Qt6+QML實(shí)現(xiàn)Windows屏幕錄制功能

    Qt6+QML實(shí)現(xiàn)Windows屏幕錄制功能

    Qt6提供了很多豐富的多媒體支持類,本文將為大家詳細(xì)介紹一下Qt6如何結(jié)合QML實(shí)現(xiàn)Windows屏幕錄制功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
    2025-04-04
  • QT實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽系統(tǒng)

    QT實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽系統(tǒng)

    這篇文章主要介紹了如何利用QT編寫一個圖片瀏覽系統(tǒng),可以支持自動播放,左右拖動切換,點(diǎn)擊列表切換,點(diǎn)擊按鈕切換等功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04

最新評論

江陵县| 河曲县| 沙坪坝区| 新兴县| 宁明县| 密云县| 昆山市| 丹江口市| 昌都县| 天津市| 清苑县| 河津市| 崇文区| 景谷| 宜兰县| 车致| 万全县| 应用必备| 庆城县| 西乌珠穆沁旗| 剑川县| 岳池县| 沈丘县| 包头市| 皮山县| 左贡县| 井冈山市| 宁化县| 天津市| 桑植县| 县级市| 湛江市| 宝清县| 措勤县| 永州市| 竹溪县| 福海县| 涪陵区| 和硕县| 张家港市| 安塞县|