[ARM入门] C-Thread-Pool线程池

[复制链接]
 楼主| 呐咯密密 发表于 2024-11-24 19:43 | 显示全部楼层 |阅读模式
C-Thread-Pool是一个轻量级、易用的线程池实现。

  1. https://github.com/Pithikos/C-Thread-PoolMIT

  2. license


特点:

  • 符合ANSI C 和 POSIX 标准

  • 支持暂停/恢复/等待操作

  • 简单易懂的 API

  • 经过充分测试


C-Thread-Pool库未预编译,我们需要与项目一起编译。在 Linux 上用 gcc 编译时,需要添加标志 -pthread,如:

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

基本用法:

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

2、创建一个具有所需线程数的线程池: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并发处理数据的例子:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include "thpool.h"

  5. typedef struct
  6. {
  7.     int *data;
  8.     int index;
  9.     long result;
  10. } test_data_t;

  11. void task(void *arg)
  12. {
  13.     test_data_t *test_data = (test_data_t *)arg;
  14.     test_data->result = (long)test_data->data[test_data->index] * test_data->data[test_data->index];
  15.     printf("Thread #%u work, test_data->result = %ld\n", (int)pthread_self(), test_data->result);
  16.     free(test_data);
  17. }

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

  22.     // 创建一个线程池,包含4个线程
  23.     threadpool thpool = thpool_init(4);

  24.     // 添加num_elements个任务到线程池
  25.     for (int i = 0; i < num_elements; i++)
  26.     {
  27.         test_data_t *test_data = malloc(sizeof(test_data_t));
  28.         test_data->data = data;
  29.         test_data->index = i;
  30.         thpool_add_work(thpool, task, test_data);
  31.     }

  32. thpool_wait(thpool);
  33. puts("Killing threadpool");
  34. thpool_destroy(thpool);

  35.     return 0;
  36. }
  1. THPOOL_DEBUG: Created thread 0 in pool
  2. THPOOL_DEBUG: Created thread 1 in pool
  3. THPOOL_DEBUG: Created thread 2 in pool
  4. THPOOL_DEBUG: Created thread 3 in pool
  5. Thread #3894134336 work, test_data->result = 1
  6. Thread #3910919744 work, test_data->result = 9
  7. Thread #3902527040 work, test_data->result = 16
  8. Thread #3885741632 work, test_data->result = 4
  9. Thread #3910919744 work, test_data->result = 25
  10. Thread #3910919744 work, test_data->result = 64
  11. Thread #3910919744 work, test_data->result = 100
  12. Thread #3885741632 work, test_data->result = 81
  13. Thread #3902527040 work, test_data->result = 36
  14. Thread #3894134336 work, test_data->result = 49
  15. Killing threadpool

在嵌入式系统中,线程池技术可以应用于多种场景,如数据处理、网络通信、传感器数据采集等。

网络服务器
  • 用途:在网络服务器中,使用线程池处理多个客户端的请求。每个客户端的请求可以被视为一个任务,线程池中的线程可以并发地处理这些任务。
  • 优势:使用线程池可以提高服务器的并发处理能力,减少因频繁创建和销毁线程而带来的开销,从而提高服务器的响应速度和整体性能。
数据处理
  • 用途:在数据处理场景中,使用线程池用于并行处理大量数据。例如,对大量数据进行排序、搜索或分析时,可以将数据分成多个小块,每个小块作为一个任务交给线程池处理。
  • 优势:通过并行处理,可以显著缩短数据处理时间,提高数据处理的效率。
数据采集
  • 用途:在实时系统中,使用线程池可以用于处理周期性或突发性的任务。例如,在嵌入式实时操作系统中,可以使用线程池来管理传感器数据的采集和处理任务。
  • 优势:线程池可以提供稳定的响应时间,确保任务在预定的时间内完成,从而满足实时系统的要求。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangjiaxu 发表于 2024-11-30 09:04 | 显示全部楼层
感觉玩MCU玩久了,多线程这种概念确实转不过来弯儿来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部