• 正文
    • 什么是線程池?
    • C-Thread-Pool
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

一個非常輕量的嵌入式線程池庫!

2024/11/25
2761
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

嵌入式開發(fā)中,多線程編程是提高系統(tǒng)性能和響應速度的重要手段。然而,頻繁地創(chuàng)建和銷毀線程會帶來較大的開銷,影響系統(tǒng)的整體性能。為了解決這個問題,我們可以使用線程池技術。

什么是線程池?

線程池(Thread Pool)是一種基于池化技術的多線程處理形式,用于管理線程的創(chuàng)建和生命周期,以及提供一個用于并行執(zhí)行任務的線程隊列。

線程池的主要目的:

線程復用:線程池中的線程可以被重復利用,用于執(zhí)行多個任務,避免了頻繁創(chuàng)建和銷毀線程的性能開銷。提高響應速度。假如創(chuàng)建線程用的時間為T1,執(zhí)行任務用的時間為T2,銷毀線程用的時間為T3,那么使用線程池就免去了T1和T3的時間。

資源控制:線程池可以限制系統(tǒng)中線程的最大數(shù)量,防止因為線程數(shù)過多而消耗過多內(nèi)存,或者導致過高的上下文切換開銷。

更方便的管理:通過線程池提供了可配置的參數(shù),如核心線程數(shù)、最大線程數(shù)、空閑線程存活時間、任務隊列的大小等,允許定制以適應不同的應用需求。

C-Thread-Pool

C-Thread-Pool是一個輕量級、易用的線程池實現(xiàn)。

https://github.com/Pithikos/C-Thread-Pool

MIT license

特點:

符合ANSI C 和 POSIX 標準

支持暫停/恢復/等待操作

簡單易懂的 API

經(jīng)過充分測試

C-Thread-Pool庫未預編譯,我們需要與項目一起編譯。在 Linux 上用 gcc 編譯時,需要添加標志 -pthread,如:

gcc example.c thpool.c -D THPOOL_DEBUG -pthread -o example

基本用法:

1、在源文件中包含頭文件:#include "thpool.h"

2、創(chuàng)建一個具有所需線程數(shù)的線程池:threadpool thpool = thpool_init(4);

3、向池中添加工作:thpool_add_work(thpool, (void*)function_p, (void*)arg_p);

C-Thread-Pool應用API可查看thpool.h 文件:

C-Thread-Pool并發(fā)處理數(shù)據(jù)的例子:

#include?<stdio.h>
#include?<stdlib.h>
#include?<pthread.h>
#include?"thpool.h"

typedef?struct?
{
????int?*data;
????int?index;?
????long?result;?
}?test_data_t;

void?task(void?*arg)?
{
????test_data_t?*test_data?=?(test_data_t?*)arg;
????test_data->result?=?(long)test_data->data[test_data->index]?*?test_data->data[test_data->index];
????printf("Thread?#%u?work,?test_data->result?=?%ldn",?(int)pthread_self(),?test_data->result);
????free(test_data);?
}

int?main(int?argc,?char?*argv[])?
{
????int?data[]?=?{1,?2,?3,?4,?5,?6,?7,?8,?9,?10};
????int?num_elements?=?sizeof(data)?/?sizeof(data[0]);

????//?創(chuàng)建一個線程池,包含4個線程
????threadpool?thpool?=?thpool_init(4);

????//?添加num_elements個任務到線程池
????for?(int?i?=?0;?i?<?num_elements;?i++)?
????{
????????test_data_t?*test_data?=?malloc(sizeof(test_data_t));
????????test_data->data?=?data;
????????test_data->index?=?i;
????????thpool_add_work(thpool,?task,?test_data);
????}

?thpool_wait(thpool);
?puts("Killing?threadpool");
?thpool_destroy(thpool);

????return?0;
}
THPOOL_DEBUG:?Created?thread?0?in?pool?
THPOOL_DEBUG:?Created?thread?1?in?pool?
THPOOL_DEBUG:?Created?thread?2?in?pool?
THPOOL_DEBUG:?Created?thread?3?in?pool?
Thread?#3894134336?work,?test_data->result?=?1
Thread?#3910919744?work,?test_data->result?=?9
Thread?#3902527040?work,?test_data->result?=?16
Thread?#3885741632?work,?test_data->result?=?4
Thread?#3910919744?work,?test_data->result?=?25
Thread?#3910919744?work,?test_data->result?=?64
Thread?#3910919744?work,?test_data->result?=?100
Thread?#3885741632?work,?test_data->result?=?81
Thread?#3902527040?work,?test_data->result?=?36
Thread?#3894134336?work,?test_data->result?=?49
Killing?threadpool

嵌入式系統(tǒng)中,線程池技術可以應用于多種場景,如數(shù)據(jù)處理、網(wǎng)絡通信、傳感器數(shù)據(jù)采集等。

網(wǎng)絡服務器

用途:在網(wǎng)絡服務器中,使用線程池處理多個客戶端的請求。每個客戶端的請求可以被視為一個任務,線程池中的線程可以并發(fā)地處理這些任務。

優(yōu)勢:使用線程池可以提高服務器的并發(fā)處理能力,減少因頻繁創(chuàng)建和銷毀線程而帶來的開銷,從而提高服務器的響應速度和整體性能。

數(shù)據(jù)處理

用途:在數(shù)據(jù)處理場景中,使用線程池用于并行處理大量數(shù)據(jù)。例如,對大量數(shù)據(jù)進行排序、搜索或分析時,可以將數(shù)據(jù)分成多個小塊,每個小塊作為一個任務交給線程池處理。

優(yōu)勢:通過并行處理,可以顯著縮短數(shù)據(jù)處理時間,提高數(shù)據(jù)處理的效率。

數(shù)據(jù)采集

用途:在實時系統(tǒng)中,使用線程池可以用于處理周期性或突發(fā)性的任務。例如,在嵌入式實時操作系統(tǒng)中,可以使用線程池來管理傳感器數(shù)據(jù)的采集和處理任務。

優(yōu)勢:線程池可以提供穩(wěn)定的響應時間,確保任務在預定的時間內(nèi)完成,從而滿足實時系統(tǒng)的要求。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號專注于嵌入式技術,包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學習筆記,同時,公眾號內(nèi)包含大量的學習資源。歡迎關注,一同交流學習,共同進步!