欢迎访问宝典百科,专注于IT类百科知识解答!
当前位置:宝典百科 >> 软件系统 >> linux >> 百科详情

linux中怎么创建线程池

2023-11-10 linux 责编:宝典百科 2522浏览

在Linux中,可以使用pthread库来创建和管理线程池。下面是一个简单的示例代码:

linux中怎么创建线程池

```c

#include

#include

#include

#define THREAD_POOL_SIZE 5

typedef struct {

void (*task)(void*); // 线程要执行的任务

void* arg; // 任务参数

} task_t;

typedef struct {

pthread_t* threads; // 线程数组

task_t* tasks; // 任务队列

int size; // 线程池大小

int count; // 当前任务数量

int head; // 任务队列的头

int tail; // 任务队列的尾

pthread_mutex_t mutex; // 互斥锁

pthread_cond_t not_empty; // 非空条件变量

pthread_cond_t not_full; // 非满条件变量

} thread_pool_t;

void* thread_func(void* arg) {

thread_pool_t* pool = (thread_pool_t*)arg;

while (1) {

pthread_mutex_lock(&(pool->mutex));

while (pool->count == 0) { // 如果任务队列为空,线程等待非空条件

pthread_cond_wait(&(pool->not_empty), &(pool->mutex));

}

task_t task = pool->tasks[pool->head]; // 取出头部任务

pool->head = (pool->head + 1) % pool->size;

pool->count--;

if (pool->count == pool->size - 1) { // 如果任务队列之前是满的,唤醒非满条件

pthread_cond_broadcast(&(pool->not_full));

}

pthread_mutex_unlock(&(pool->mutex));

// 执行任务

(task.task)(task.arg);

}

return NULL;

}

// 初始化线程池

void thread_pool_init(thread_pool_t* pool, int size) {

pool->threads = (pthread_t*)malloc(size * sizeof(pthread_t));

pool->tasks = (task_t*)malloc(size * sizeof(task_t));

pool->size = size;

pool->count = 0;

pool->head = 0;

pool->tail = 0;

pthread_mutex_init(&(pool->mutex), NULL);

pthread_cond_init(&(pool->not_empty), NULL);

pthread_cond_init(&(pool->not_full), NULL);

int i;

for (i = 0; i < size; i++) {

pthread_create(&(pool->threads[i]), NULL, thread_func, pool);

}

}

// 销毁线程池

void thread_pool_destroy(thread_pool_t* pool) {

int i;

for (i = 0; i < pool->size; i++) {

pthread_cancel(pool->threads[i]);

}

free(pool->threads);

free(pool->tasks);

pthread_mutex_destroy(&(pool->mutex));

pthread_cond_destroy(&(pool->not_empty));

pthread_cond_destroy(&(pool->not_full));

}

// 添加任务到线程池

void thread_pool_add_task(thread_pool_t* pool, void (*task)(void*), void* arg) {

pthread_mutex_lock(&(pool->mutex));

while (pool->count == pool->size) { // 如果任务队列已满,等待非满条件

pthread_cond_wait(&(pool->not_full), &(pool->mutex));

}

pool->tasks[pool->tail].task = task; // 添加任务到尾部

pool->tasks[pool->tail].arg = arg;

pool->tail = (pool->tail + 1) % pool->size;

pool->count++;

if (pool->count == 1) { // 如果任务队列之前是空的,唤醒非空条件

pthread_cond_broadcast(&(pool->not_empty));

}

pthread_mutex_unlock(&(pool->mutex));

}

```

使用示例:

```c

void task_func(void* arg) {

int n = *(int*)arg;

printf("Task %d is running\n", n);

usleep(1000 * n); // 模拟任务执行

}

int main() {

thread_pool_t pool;

thread_pool_init(&pool, THREAD_POOL_SIZE);

int i;

for (i = 0; i < 10; i++) {

// 创建任务参数并添加到线程池

int* arg = (int*)malloc(sizeof(int));

*arg = i;

thread_pool_add_task(&pool, task_func, arg);

}

sleep(10); // 等待所有任务执行完毕

thread_pool_destroy(&pool);

return 0;

}

```

在上面的示例中,我们使用一个简单的任务函数来模拟具体的任务。在主函数中,我们创建了一个线程池,然后添加了10个任务到线程池中,每个任务都带有一个参数。最后,我们使用sleep函数等待所有任务完成,然后销毁线程池。

本站申明:宝典百科为纯IT类百科展示网站,网站所有信息均来源于网络,若有误或侵权请联系本站!
为您推荐
  • Linux领域有以下主流认证体系,涵盖不同发行版和技术方向,适合不同阶段的从业者:1. LPIC(Linux Professional Institute认证) - 由非营利组织LPI颁发,发行版中立,分为三级: * LPIC-1:系统管理员基础(文件权限、Shell脚本、软
    2025-06-26 linux 202浏览
  • 在Windows系统上远程访问Linux服务器或桌面环境有多种方法,每种方法适用于不同场景,以下详细介绍常见的几种方案: 1. SSH(Secure Shell)远程命令行访问 - 适用场景:Linux服务器管理、命令行操作。 - 工具推荐: - Windows内
    2025-06-25 linux 4922浏览
栏目推荐
  • 在Linux系统中,465端口通常用于安全的SMTP(Simple Mail Transfer Protocol)邮件传输。具体来说,它是用于SMTP over SSL(SMTPS)的端口。通过这个端口发送的邮件连接是经过SSL/TLS加密的,以增加安全性。需要注意的是,虽然465端口曾被广
    2025-05-03 linux 5434浏览
  • 在Linux系统下,设置硬盘启动通常需要通过BIOS或UEFI设置来完成。以下是一般的步骤:1. 重启计算机:在计算机启动时,注意屏幕上的提示信息,通常会显示按哪个键进入 BIOS/UEFI 设置。常用的按键包括 `F2`、`Delete`、`Esc`、`F10` 等
    2025-05-03 linux 3953浏览
  • Linux和JVM(Java Virtual Machine)之间的关系可以从几个方面进行探讨:1. 操作系统和平台: - Linux是一个开源的操作系统,广泛应用于服务器、嵌入式系统和个人电脑等多个领域。 - JVM是运行Java程序的虚拟机,负责执行Java字节码
    2025-05-03 linux 6738浏览
全站推荐
  • 验证松下相机的真伪可以从以下几个关键点入手:1. 包装查验 - 正品包装盒材质坚固,印刷清晰,色彩准确。检查盒身是否有松下官方标识、型号标签、序列号(通常位于底部或侧面),并与机身序列号一致。 - 注意封箱
    2025-06-22 松下 4100浏览
  • 富士相机在徒步旅行中的使用需结合轻量化、环境适应性与拍摄需求,以下从设备选择、参数设置、保护措施及拍摄技巧详细说明: 1. 设备选择与轻量化机型推荐:优先选择X-T30 II、X-S10或X100V等轻便机型,兼顾画质与便携性。
    2025-06-22 富士 3191浏览
  • 索尼相机用于视频号直播需要经过一系列硬件连接和软件设置,以下是详细步骤和关键注意事项: 1. 硬件准备相机选择:推荐支持“干净HDMI输出”的索尼机型(如A7系列、ZV系列、FX系列),确保直播时无菜单叠加。采集卡:需
    2025-06-22 索尼 1159浏览
友情链接
底部分割线