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

C語言線程池的常見實(shí)現(xiàn)方式詳解

 更新時(shí)間:2025年01月06日 14:09:46   作者:半桶水專家  
本文介紹了如何使用 C 語言實(shí)現(xiàn)一個(gè)基本的線程池,線程池的實(shí)現(xiàn)包括工作線程、任務(wù)隊(duì)列、任務(wù)調(diào)度、線程池的初始化、任務(wù)添加、銷毀等步驟,感興趣的朋友跟隨小編一起看看吧

在 C 語言中,線程池通常通過 pthread 庫(kù)來實(shí)現(xiàn)。以下是一個(gè)詳細(xì)的說明,介紹了 C 語言線程池的常見實(shí)現(xiàn)方式,包括核心概念、實(shí)現(xiàn)步驟和具體的代碼示例。

1. 線程池的基本結(jié)構(gòu)

線程池的核心概念是有一個(gè)固定數(shù)量的線程等待執(zhí)行任務(wù)。任務(wù)通常通過任務(wù)隊(duì)列傳遞,線程從隊(duì)列中取出任務(wù)并執(zhí)行。線程池的主要目標(biāo)是提高資源利用率,避免頻繁地創(chuàng)建和銷毀線程。

線程池的主要組件:

  • 任務(wù)結(jié)構(gòu):保存任務(wù)信息,比如任務(wù)的函數(shù)指針和參數(shù)。
  • 任務(wù)隊(duì)列:用于存放待處理的任務(wù)。當(dāng)所有工作線程都在忙時(shí),新提交的任務(wù)會(huì)被放到隊(duì)列中,直到線程空閑出來。
  • 線程池控制:管理線程池的線程,調(diào)度任務(wù)的分發(fā),維護(hù)任務(wù)隊(duì)列。

2. 線程池的實(shí)現(xiàn)步驟

以下是實(shí)現(xiàn)一個(gè)簡(jiǎn)單線程池的基本步驟:

初始化線程池

創(chuàng)建一定數(shù)量的線程,并使它們處于等待狀態(tài)。

創(chuàng)建一個(gè)任務(wù)隊(duì)列,用來存儲(chǔ)待執(zhí)行的任務(wù)。

任務(wù)提交

用戶提交任務(wù)到線程池,線程池會(huì)把任務(wù)放入任務(wù)隊(duì)列中,等待工作線程去執(zhí)行。

工作線程

工作線程從任務(wù)隊(duì)列中取出任務(wù)并執(zhí)行。

如果沒有任務(wù),線程會(huì)阻塞,直到有任務(wù)提交到任務(wù)隊(duì)列。

關(guān)閉線程池

關(guān)閉線程池時(shí),需要確保所有任務(wù)完成后再銷毀線程池,并且釋放所有資源。

3. 線程池的核心數(shù)據(jù)結(jié)構(gòu)

任務(wù)結(jié)構(gòu): 每個(gè)任務(wù)通常包括任務(wù)的執(zhí)行函數(shù)和任務(wù)的參數(shù)。

typedef struct {
    void (*routine)(void *arg);  // 任務(wù)執(zhí)行的函數(shù)
    void *arg;                   // 傳遞給任務(wù)函數(shù)的參數(shù)
} task_t;

線程池結(jié)構(gòu): 線程池需要包含任務(wù)隊(duì)列、線程數(shù)組、線程數(shù)量、鎖以及條件變量等。

typedef struct {
    pthread_t *threads;           // 工作線程數(shù)組
    task_t *task_queue;           // 任務(wù)隊(duì)列
    int queue_size;               // 隊(duì)列大小
    int head, tail;               // 隊(duì)列頭尾索引
    int thread_count;             // 線程池中的線程數(shù)
    pthread_mutex_t lock;        // 鎖,保護(hù)任務(wù)隊(duì)列
    pthread_cond_t cond;         // 條件變量,喚醒工作線程
    int shutdown;                 // 是否關(guān)閉線程池
} thread_pool_t;

4. 線程池的詳細(xì)實(shí)現(xiàn)

下面是一個(gè)完整的線程池實(shí)現(xiàn),包括初始化、任務(wù)提交、任務(wù)執(zhí)行和銷毀。

4.1 初始化線程池

首先需要?jiǎng)?chuàng)建線程池,并初始化必要的數(shù)據(jù)結(jié)構(gòu)。

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
typedef struct {
    void (*routine)(void *arg);  // 任務(wù)執(zhí)行的函數(shù)
    void *arg;                   // 傳遞給任務(wù)函數(shù)的參數(shù)
} task_t;
typedef struct {
    pthread_t *threads;           // 工作線程數(shù)組
    task_t *task_queue;           // 任務(wù)隊(duì)列
    int queue_size;               // 隊(duì)列大小
    int head, tail;               // 隊(duì)列頭尾索引
    int thread_count;             // 線程池中的線程數(shù)
    pthread_mutex_t lock;        // 鎖,保護(hù)任務(wù)隊(duì)列
    pthread_cond_t cond;         // 條件變量,喚醒工作線程
    int shutdown;                 // 是否關(guān)閉線程池
} thread_pool_t;
void *worker(void *arg) {
    thread_pool_t *pool = (thread_pool_t *)arg;
    while (1) {
        pthread_mutex_lock(&pool->lock);
        while (pool->head == pool->tail && !pool->shutdown) {
            pthread_cond_wait(&pool->cond, &pool->lock);  // 等待任務(wù)
        }
        // 檢查是否關(guān)閉線程池
        if (pool->shutdown) {
            pthread_mutex_unlock(&pool->lock);
            break;
        }
        task_t task = pool->task_queue[pool->head];  // 獲取任務(wù)
        pool->head = (pool->head + 1) % pool->queue_size;  // 隊(duì)列中移除任務(wù)
        pthread_mutex_unlock(&pool->lock);
        task.routine(task.arg);  // 執(zhí)行任務(wù)
    }
    pthread_exit(NULL);
}
void thread_pool_init(thread_pool_t *pool, int thread_count, int queue_size) {
    pool->threads = (pthread_t *)malloc(thread_count * sizeof(pthread_t));
    pool->task_queue = (task_t *)malloc(queue_size * sizeof(task_t));
    pool->queue_size = queue_size;
    pool->head = pool->tail = 0;
    pool->thread_count = thread_count;
    pool->shutdown = 0;
    pthread_mutex_init(&pool->lock, NULL);
    pthread_cond_init(&pool->cond, NULL);
    // 創(chuàng)建線程
    for (int i = 0; i < thread_count; i++) {
        pthread_create(&pool->threads[i], NULL, worker, pool);
    }
}

4.2 提交任務(wù)

當(dāng)用戶需要執(zhí)行某個(gè)任務(wù)時(shí),任務(wù)會(huì)被加入任務(wù)隊(duì)列,等待線程執(zhí)行。

void thread_pool_add_task(thread_pool_t *pool, void (*routine)(void *), void *arg) {
    pthread_mutex_lock(&pool->lock);
    // 檢查任務(wù)隊(duì)列是否滿
    if ((pool->tail + 1) % pool->queue_size != pool->head) {
        pool->task_queue[pool->tail].routine = routine;
        pool->task_queue[pool->tail].arg = arg;
        pool->tail = (pool->tail + 1) % pool->queue_size;  // 更新隊(duì)列尾部
        pthread_cond_signal(&pool->cond);  // 喚醒一個(gè)工作線程
    }
    pthread_mutex_unlock(&pool->lock);
}

4.3 關(guān)閉線程池

關(guān)閉線程池時(shí),需要等待所有線程處理完任務(wù)后才能銷毀線程池??梢酝ㄟ^設(shè)置 shutdown 標(biāo)志來通知線程池停止。

void thread_pool_destroy(thread_pool_t *pool) {
    pthread_mutex_lock(&pool->lock);
    pool->shutdown = 1;
    pthread_cond_broadcast(&pool->cond);  // 喚醒所有線程,確保線程能夠退出
    pthread_mutex_unlock(&pool->lock);
    // 等待所有線程退出
    for (int i = 0; i < pool->thread_count; i++) {
        pthread_join(pool->threads[i], NULL);
    }
    free(pool->threads);
    free(pool->task_queue);
    pthread_mutex_destroy(&pool->lock);
    pthread_cond_destroy(&pool->cond);
}

4.4 示例任務(wù)函數(shù)

用戶可以定義自己的任務(wù)函數(shù),傳遞參數(shù),并在任務(wù)函數(shù)中執(zhí)行實(shí)際的工作。

void print_hello(void *arg) {
    printf("Hello, %s!\n", (char *)arg);
}
int main() {
    thread_pool_t pool;
    thread_pool_init(&pool, 4, 10);  // 創(chuàng)建一個(gè)線程池,包含4個(gè)線程和10個(gè)任務(wù)隊(duì)列
    for (int i = 0; i < 5; i++) {
        char *name = malloc(10);
        sprintf(name, "Task %d", i + 1);
        thread_pool_add_task(&pool, print_hello, name);
    }
    sleep(1);  // 等待任務(wù)執(zhí)行
    thread_pool_destroy(&pool);  // 銷毀線程池
    return 0;
}

5. 線程池的調(diào)優(yōu)和優(yōu)化

在實(shí)際應(yīng)用中,線程池的性能可以通過以下幾個(gè)方面進(jìn)行調(diào)優(yōu)和優(yōu)化:

  • 最大線程數(shù)和最小線程數(shù):為了避免線程過多導(dǎo)致的資源競(jìng)爭(zhēng),可以設(shè)置最小線程數(shù)和最大線程數(shù)。
  • 任務(wù)隊(duì)列長(zhǎng)度:任務(wù)隊(duì)列的長(zhǎng)度要適中。過長(zhǎng)的隊(duì)列可能導(dǎo)致任務(wù)過度堆積,過短的隊(duì)列則可能導(dǎo)致線程池?zé)o法充分利用資源。
  • 動(dòng)態(tài)線程調(diào)整:根據(jù)系統(tǒng)負(fù)載動(dòng)態(tài)增加或減少線程數(shù)量,能夠提高系統(tǒng)的效率和響應(yīng)速度。
  • 任務(wù)超時(shí)機(jī)制:為了防止某些任務(wù)長(zhǎng)時(shí)間占用線程,線程池可以設(shè)置任務(wù)的超時(shí)機(jī)制,當(dāng)任務(wù)超時(shí)后放棄執(zhí)行或重新調(diào)度。

總結(jié)

本文介紹了如何使用 C 語言實(shí)現(xiàn)一個(gè)基本的線程池。線程池的實(shí)現(xiàn)包括工作線程、任務(wù)隊(duì)列、任務(wù)調(diào)度、線程池的初始化、任務(wù)添加、銷毀等步驟。通過這種方式,可以在多任務(wù)、高并發(fā)的場(chǎng)景中有效地管理線程,減少線程創(chuàng)建和銷毀的開銷,提高系統(tǒng)的效率。

到此這篇關(guān)于C語言線程池的常見實(shí)現(xiàn)方式詳解的文章就介紹到這了,更多相關(guān)C語言線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入分析C++中兩個(gè)大數(shù)相乘結(jié)果不正確的問題

    深入分析C++中兩個(gè)大數(shù)相乘結(jié)果不正確的問題

    本篇文章是對(duì)C++中兩個(gè)大數(shù)相乘結(jié)果不正確的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 在C語言中對(duì)utmp文件進(jìn)行查找和寫入操作的函數(shù)小結(jié)

    在C語言中對(duì)utmp文件進(jìn)行查找和寫入操作的函數(shù)小結(jié)

    這篇文章主要介紹了在C語言中對(duì)utmp文件進(jìn)行查找和寫入操作的函數(shù)小結(jié),包括pututline()函數(shù)和getutline()函數(shù)以及getutid()函數(shù),需要的朋友可以參考下
    2015-08-08
  • Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn)

    Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn)

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn),這是一個(gè)非常值得研究的問題,需要的朋友可以參考下
    2014-09-09
  • C++ 實(shí)現(xiàn)LRU 與 LFU 的緩存算法

    C++ 實(shí)現(xiàn)LRU 與 LFU 的緩存算法

    設(shè)計(jì)和實(shí)現(xiàn)一個(gè)LRU 緩存機(jī)制。其支持獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put,設(shè)計(jì)并實(shí)現(xiàn)最少訪問頻率(LFU)緩存的數(shù)據(jù)結(jié)構(gòu)。LFU的每個(gè)數(shù)據(jù)塊都有一個(gè)引用計(jì)數(shù),所有數(shù)據(jù)塊按照引用計(jì)數(shù)排序,具有相同引用計(jì)數(shù)的數(shù)據(jù)塊則按照時(shí)間進(jìn)行排序。其支持get 和 put,具體了解請(qǐng)看下文
    2021-09-09
  • 詳解C語言中的指針與數(shù)組的定義與使用

    詳解C語言中的指針與數(shù)組的定義與使用

    這篇文章主要介紹了C語言中的指針與數(shù)組的定義與使用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • C++的繼承法則詳解

    C++的繼承法則詳解

    本文詳細(xì)介紹了C++中的繼承機(jī)制,包括繼承的概念、定義、使用方法、訪問限定符、賦值兼容轉(zhuǎn)換、作用域、默認(rèn)成員函數(shù)、友元關(guān)系、靜態(tài)成員以及單繼承、多繼承和菱形繼承,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C++ RTTI與4種類型轉(zhuǎn)換的深入理解

    C++ RTTI與4種類型轉(zhuǎn)換的深入理解

    這篇文章主要給大家介紹了關(guān)于C++ RTTI與4種類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++ 實(shí)現(xiàn)哈希表的實(shí)例

    C++ 實(shí)現(xiàn)哈希表的實(shí)例

    這篇文章主要介紹了C++ 實(shí)現(xiàn)哈希表的實(shí)例的相關(guān)資料,這里使用C++實(shí)現(xiàn)哈希表的實(shí)例幫助大家徹底理解哈希表的原理,需要的朋友可以參考下
    2017-08-08
  • Matlab實(shí)現(xiàn)黑洞優(yōu)化算法的示例代碼

    Matlab實(shí)現(xiàn)黑洞優(yōu)化算法的示例代碼

    根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機(jī)制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生.本文將用Matlab實(shí)現(xiàn)這一算法,需要的可以參考一下
    2022-06-06
  • C++?線段樹原理與實(shí)現(xiàn)示例詳解

    C++?線段樹原理與實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了C++?線段樹原理與實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

边坝县| 本溪| 马龙县| 吴桥县| 沙河市| 邵东县| 博湖县| 即墨市| 邯郸县| 土默特右旗| 宕昌县| 徐州市| 北票市| 盱眙县| 婺源县| 上饶县| 广饶县| 商丘市| 日照市| 清流县| 陇西县| 寿宁县| 四子王旗| 张家港市| 常德市| 阿荣旗| 昌宁县| 吉隆县| 宁化县| 绵阳市| 姜堰市| 都昌县| 玛多县| 天津市| 南木林县| 公安县| 阿克陶县| 东山县| 治县。| 伊宁市| 锡林郭勒盟|