加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 什么是線程池?
    • C-Thread-Pool
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一個(gè)非常輕量的嵌入式線程池庫(kù)!

11/25 10:15
1069
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

什么是線程池?

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

線程池的主要目的:

線程復(fù)用:線程池中的線程可以被重復(fù)利用,用于執(zhí)行多個(gè)任務(wù),避免了頻繁創(chuàng)建和銷(xiāo)毀線程的性能開(kāi)銷(xiāo)。提高響應(yīng)速度。假如創(chuàng)建線程用的時(shí)間為T(mén)1,執(zhí)行任務(wù)用的時(shí)間為T(mén)2,銷(xiāo)毀線程用的時(shí)間為T(mén)3,那么使用線程池就免去了T1和T3的時(shí)間。

資源控制:線程池可以限制系統(tǒng)中線程的最大數(shù)量,防止因?yàn)榫€程數(shù)過(guò)多而消耗過(guò)多內(nèi)存,或者導(dǎo)致過(guò)高的上下文切換開(kāi)銷(xiāo)。

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

C-Thread-Pool

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

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

MIT license

特點(diǎn):

符合ANSI C 和 POSIX 標(biāo)準(zhǔn)

支持暫停/恢復(fù)/等待操作

簡(jiǎn)單易懂的 API

經(jīng)過(guò)充分測(cè)試

C-Thread-Pool庫(kù)未預(yù)編譯,我們需要與項(xiàng)目一起編譯。在 Linux 上用 gcc 編譯時(shí),需要添加標(biāo)志 -pthread,如:

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

基本用法:

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

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

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

C-Thread-Pool應(yīng)用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)建一個(gè)線程池,包含4個(gè)線程
????threadpool?thpool?=?thpool_init(4);

????//?添加num_elements個(gè)任務(wù)到線程池
????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ù)可以應(yīng)用于多種場(chǎng)景,如數(shù)據(jù)處理、網(wǎng)絡(luò)通信、傳感器數(shù)據(jù)采集等。

網(wǎng)絡(luò)服務(wù)器

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

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

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

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

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

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

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

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

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

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