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

C語言創(chuàng)建線程thread_create()的方法

 更新時間:2021年02月04日 14:18:48   投稿:zx  
這篇文章主要介紹了C語言創(chuàng)建線程thread_create()的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在頭文件 threads.h 中,定義和聲明了支持多線程的宏、類型和函數(shù)。所有直接與線程相關(guān)的標識符,均以前綴 thrd_ 作為開頭。例如,thrd_t 是一個對象類型,它標識了一個線程。

函數(shù) thrd_create()用于創(chuàng)建并開始執(zhí)行一個新線程。函數(shù) thrd_create()的其中一個參數(shù)為在新線程中需要被執(zhí)行的函數(shù) thrd_create()的其中一個參數(shù)為在新線程中需要被執(zhí)行的函數(shù)。thrd_create()的完整原型是:

int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);

參數(shù) func 是一個指針,它指向在新線程需要被執(zhí)行的函數(shù),而 void 指針 arg 用于向該函數(shù)傳遞參數(shù)。換句話說,新線程將執(zhí)行函數(shù)調(diào)用 func(arg)。

參數(shù) func 的類型為 thrd_start_t,它被定義為 int(*)(void*)(這是一個函數(shù)指針,指向一個 void 指針作為其參數(shù)并返回一個 int 值的函數(shù)),因此,該線程執(zhí)行的函數(shù)返回一個 int 類型的值。

程序在后續(xù)過程中可以通過調(diào)用函數(shù) thread_join()獲得這個 int 類型的返回值(必要時,需等待該線程執(zhí)行完)。

如果一個線程啟動成功,函數(shù) thread_create()將新線程寫入一個對象進行標識,并通過參數(shù) thr 指向該對象,然后返回宏值 thread_success。

在大多數(shù)情況下,后續(xù)的其他操作均依賴于該線程的執(zhí)行結(jié)果,并且只有當該線程完成后,才能執(zhí)行其他操作。函數(shù) thread_join()用于確保一個線程已完成。它的原型是:

int thrd_join(thrd_t thr, int *result);

調(diào)用 thread_join()的線程會被阻塞,直到通過 thr 標識的線程執(zhí)行完成,這里“阻塞”(block)指的是:線程會在調(diào)用 thread_join()的位置停留必要的時間。然后,thread_join()將線程 thr 中執(zhí)行函數(shù)的返回值寫入指針 result 所引用的 int 變量中,假設(shè) result 不是一個空指針。最后,thread_join()釋放屬于線程 thr 的所有資源。

如果程序邏輯上并不需要等待線程 thr 結(jié)束,則應(yīng)該調(diào)用以下函數(shù):

int thrd_detach(thrd_t thr);

thrd_detach()使得當線程 thr 執(zhí)行完成后,自動釋放線程占用的所有資源。一旦一個線程執(zhí)行了分離操作(調(diào)用 thrd_detach()),將不用程序等待其結(jié)束,程序也不會獲得該線程執(zhí)行函數(shù)的返回值。對于每個創(chuàng)建的線程,調(diào)用 thread_join()或 thread_detach()不得超過一次。

在例 1 中的程序展示了使用并行操作處理數(shù)組的一種方式。各個線程先自行處理數(shù)組的各部分,然后將它們的處理結(jié)果組合在一起。該程序僅需計算一個數(shù)字序列的總和。

函數(shù) sum()首先根據(jù)創(chuàng)建線程的最大數(shù)量確定劃分數(shù)組所得的各組元素的最大數(shù)量,然后調(diào)用遞歸輔助函數(shù) parallel_sum()。

函數(shù) parallel_sum()將數(shù)組平均分為兩半,將其中的一半交給一個新線程處理,同時調(diào)用自身來處理另一半數(shù)組。如該例所示,一個線程函數(shù)需要多個參數(shù),這些參數(shù)通常采用結(jié)構(gòu)進行封裝。

【例1】在幾個并行線程中計算數(shù)組元素的和

#include <stdbool.h>
#include <threads.h>
#define MAX_THREADS 8      // 1、2、4、8……所創(chuàng)建線程數(shù)量的最大值
#define MIN_BLOCK_SIZE 100   // 一個數(shù)組塊的最小值
typedef struct         // 函數(shù)parallel_sum()的參數(shù)
{
  float *start;    // 傳遞給parallel_sum()的數(shù)組塊的起始地址
  int len;      // 數(shù)組塊長度
  int block_size;   // 最小數(shù)組塊的大小
  double sum;         // 求和結(jié)果
} Sum_arg;
int parallel_sum(void *arg);  // 線程函數(shù)的原型
// ---------------------------------------------------------------
// 計算數(shù)組元素的和,并寫入*sumPtr
// sum()調(diào)用函數(shù)parallel_sum()進行并行處理
// 返回值:如果沒有發(fā)生錯誤,則返回true;否則,返回false
bool sum(float arr[], int len, double* sumPtr)
{
  int block_size = len / MAX_THREADS;
  if (block_size < MIN_BLOCK_SIZE) block_size = len;
  Sum_arg args = { arr, len, block_size, 0.0 };
  if (parallel_sum(&args))
  { *sumPtr = args.sum; return true; }
  else
    return false;
}
// ---------------------------------------------------------------
// 遞歸輔助函數(shù),用以將工作分解到幾個線程中處理
int parallel_sum(void *arg)
{
  Sum_arg *argp = (Sum_arg*)arg;       // 指向參數(shù)的指針
  if (argp->len <= argp->block_size)         // 如果length <= block_size,
                            // 對所有元素求和
  {                                 
    for (int i = 0; i < argp->len; ++i)
      argp->sum += argp->start[i];
    return 1;
  }
  else                        // 如果length > block_size,
                            // 分解數(shù)組
  {                                      
    int mid = argp->len / 2;
    Sum_arg arg2 = { argp->start+mid, argp->len-mid,
             argp->block_size, 0};    // 指定后一半數(shù)組
    argp->len = mid;           // 前一半數(shù)組的長度
    thrd_t th;               // 在新線程中處理前一半數(shù)組
    int res = 0;
    if (thrd_create(&th, parallel_sum, arg) != thrd_success)
      return 0;              // 沒能成功創(chuàng)建新線程
    if (!parallel_sum(&arg2))  // 在當前線程下,以遞歸方式處理后一半數(shù)組
    {
      thrd_detach(th); return 0;     // 遞歸調(diào)用失敗
    }
    thrd_join(th, &res);
    if (!res)
      return 0;      // 同級線程報告執(zhí)行失敗
    argp->sum += arg2.sum;
    return 1; 
  }
}

到此這篇關(guān)于C語言創(chuàng)建線程thread_create()的方法的文章就介紹到這了,更多相關(guān)C語言創(chuàng)建線程 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言指針詳解之野指針

    C語言指針詳解之野指針

    這篇文章主要為大家介紹了C語言野指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++中內(nèi)存池的簡單原理及實現(xiàn)詳解

    C++中內(nèi)存池的簡單原理及實現(xiàn)詳解

    內(nèi)存池的思想是,在真正使用內(nèi)存之前,預(yù)先申請分配一定數(shù)量、大小預(yù)設(shè)的內(nèi)存塊留作備用。本文主要來和大家聊聊內(nèi)存池的簡單原理及實現(xiàn),希望對大家有所幫助
    2023-03-03
  • C基礎(chǔ) redis緩存訪問詳解

    C基礎(chǔ) redis緩存訪問詳解

    下面小編就為大家?guī)硪黄狢基礎(chǔ) redis緩存訪問詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 深入解析C++11?lambda表達式/包裝器/線程庫

    深入解析C++11?lambda表達式/包裝器/線程庫

    這篇文章主要介紹了C++11?lambda表達式/包裝器/線程庫的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C語言 語義陷阱超詳細梳理總結(jié)

    C語言 語義陷阱超詳細梳理總結(jié)

    這篇文章主要介紹了C語言常見的一些語義陷阱,梳理的比較全面,對我們做開發(fā)的過程中有一定幫助,感興趣的朋友快來看看吧
    2022-03-03
  • 利用Matlab仿真實現(xiàn)圖像煙霧識別(k-means聚類圖像分割+LBP+PCA+SVM)

    利用Matlab仿真實現(xiàn)圖像煙霧識別(k-means聚類圖像分割+LBP+PCA+SVM)

    本文主要介紹了利用k-means聚類實現(xiàn)圖像分割+LBP算法進行特征提取+PCA算法進行特征降維+SVM算法訓(xùn)練二分類模型從而實現(xiàn)煙霧識別。文中介紹很詳細,感興趣的朋友可以了解一下
    2021-12-12
  • 使用C語言判斷英文字符大小寫的方法

    使用C語言判斷英文字符大小寫的方法

    這篇文章主要介紹了使用C語言判斷英文字符大小寫的方法,分別為isupper()函數(shù)和islower()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++11/14 線程的創(chuàng)建與分離的實現(xiàn)

    C++11/14 線程的創(chuàng)建與分離的實現(xiàn)

    這篇文章主要介紹了C++11/14 線程的創(chuàng)建與分離的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • C語言實現(xiàn)素因子分解

    C語言實現(xiàn)素因子分解

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)素因子分解,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 深入理解C預(yù)處理器

    深入理解C預(yù)處理器

    下面小編就為大家?guī)硪黄钊肜斫釩預(yù)處理器。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論

婺源县| 望谟县| 三门峡市| 绥滨县| 红安县| 岐山县| 太谷县| 大安市| 桐梓县| 五寨县| 潜江市| 嘉兴市| 三亚市| 吴旗县| 房产| 昌平区| 凌源市| 永昌县| 昌宁县| 岐山县| 彰化市| 大冶市| 融水| 庆城县| 民县| 恩施市| 康马县| 饶平县| 昔阳县| 乳源| 浙江省| 德州市| 凤翔县| 犍为县| 永康市| 博客| 嘉鱼县| 屏东市| 富源县| 北川| 安阳县|