0

0

Linux如何构建多线程任务队列_Linux线程架构示例

尊渡假赌尊渡假赌尊渡假赌

尊渡假赌尊渡假赌尊渡假赌

发布时间:2025-11-29 21:15:06

|

281人浏览过

|

来源于php中文网

原创

多线程任务队列通过共享队列和线程池实现并发,核心包括任务结构体、队列、线程池及同步机制;使用pthread库创建线程,互斥锁保护队列,条件变量唤醒线程;任务提交后由空闲线程执行,支持并行处理如网络请求等场景;需注意线程安全、内存管理和虚假唤醒等问题。

linux如何构建多线程任务队列_linux线程架构示例

在Linux环境下,多线程任务队列是一种常见的并发编程模型,适用于需要并行处理大量短时或耗时任务的场景,比如网络服务器、日志处理系统或图像批量处理程序。它通过一个共享的任务队列和多个工作线程协作完成任务分发与执行,提升程序吞吐量和响应速度。

基本组件设计

一个多线程任务队列通常包含以下几个核心部分:

  • 任务结构体(Task):封装要执行的函数及其参数。
  • 任务队列(Task Queue):使用队列数据结构(如链表或循环缓冲区)存储待处理任务。
  • 线程池(Thread Pool):一组预先创建的工作线程,从队列中取出任务并执行。
  • 同步机制:使用互斥锁(mutex)保护共享队列,条件变量(condition variable)实现线程等待/唤醒。

实现步骤与代码框架

以下是一个简化的C语言示例,展示如何在Linux下使用pthread库构建一个基础的多线程任务队列。

#include 
#include 
#include 

// 任务函数类型定义 typedef void (task_func_t)(void );

// 任务结构 typedef struct task { task_func_t func; void arg; struct task next; } task_t;

// 任务队列结构 typedef struct { task_t head; task_t tail; pthread_mutex_t lock; pthread_cond_t cond; int shutdown; } task_queue_t;

// 线程池结构 typedef struct { pthread_t threads; int thread_count; task_queue_t queue; } thread_pool_t;

// 初始化任务队列 void queue_init(task_queue_t *q) { q->head = NULL; q->tail = NULL; pthread_mutex_init(&q->lock, NULL); pthread_cond_init(&q->cond, NULL); q->shutdown = 0; }

// 向队列添加任务 void queue_push(task_queue_t q, task_func_t func, void arg) { task_t t = (task_t )malloc(sizeof(task_t)); t->func = func; t->arg = arg; t->next = NULL;

pthread_mutex_lock(&q-youjiankuohaophpcnlock);
if (q-youjiankuohaophpcntail) {
    q-youjiankuohaophpcntail-youjiankuohaophpcnnext = t;
} else {
    q-youjiankuohaophpcnhead = t;
}
q-youjiankuohaophpcntail = t;
pthread_cond_signal(&q-youjiankuohaophpcncond); // 唤醒一个等待线程
pthread_mutex_unlock(&q-youjiankuohaophpcnlock);

}

Codiga
Codiga

可自定义的静态代码分析检测工具

下载

// 从队列获取任务(阻塞) task_t queue_pop(task_queue_t q) { pthread_mutex_lock(&q->lock); while (q->head == NULL && !q->shutdown) { pthread_cond_wait(&q->cond, &q->lock); }

if (q-youjiankuohaophpcnshutdown) {
    pthread_mutex_unlock(&q-youjiankuohaophpcnlock);
    return NULL;
}

task_t *t = q-youjiankuohaophpcnhead;
q-youjiankuohaophpcnhead = t-youjiankuohaophpcnnext;
if (!q-youjiankuohaophpcnhead) q-youjiankuohaophpcntail = NULL;

pthread_mutex_unlock(&q-youjiankuohaophpcnlock);
return t;

}

// 工作线程主函数 void worker(void arg) { task_queue_t q = (task_queue_t)arg;

while (1) {
    task_t *t = queue_pop(q);
    if (!t) break; // 收到关闭信号

    t-youjiankuohaophpcnfunc(t-youjiankuohaophpcnarg);
    free(t);
}
return NULL;

}

// 创建线程池 thread_pool_t pool_create(int num_threads) { thread_pool_t pool = (thread_pool_t)malloc(sizeof(thread_pool_t)); pool->thread_count = num_threads; pool->threads = (pthread_t)malloc(num_threads sizeof(pthread_t)); pool->queue = (task_queue_t)malloc(sizeof(task_queue_t));

queue_init(pool-youjiankuohaophpcnqueue);

for (int i = 0; i zuojiankuohaophpcn num_threads; i++) {
    pthread_create(&pool-youjiankuohaophpcnthreads[i], NULL, worker, pool-youjiankuohaophpcnqueue);
}
return pool;

}

// 提交任务到线程池 void pool_submit(thread_pool_t pool, task_func_t func, void arg) { queue_push(pool->queue, func, arg); }

// 销毁线程池 void pool_destroy(thread_pool_t *pool) { pthread_mutex_lock(&pool->queue->lock); pool->queue->shutdown = 1; pthread_cond_broadcast(&pool->queue->cond); pthread_mutex_unlock(&pool->queue->lock);

for (int i = 0; i zuojiankuohaophpcn pool-youjiankuohaophpcnthread_count; i++) {
    pthread_join(pool-youjiankuohaophpcnthreads[i], NULL);
}

free(pool-youjiankuohaophpcnthreads);
free(pool-youjiankuohaophpcnqueue);
free(pool);

}

使用示例

下面是一个简单的测试函数,演示如何提交任务:

void print_task(void *arg) {
    int id = *(int*)arg;
    printf("正在执行任务 %d\n", id);
    sleep(1); // 模拟耗时操作
}

int main() { thread_pool_t *pool = pool_create(4); // 创建4个线程

for (int i = 0; i zuojiankuohaophpcn 8; i++) {
    int *id = (int*)malloc(sizeof(int));
    *id = i;
    pool_submit(pool, print_task, id);
}

sleep(2); // 等待任务执行

pool_destroy(pool);
return 0;

}

编译时需链接pthread库:
gcc -o thread_pool thread_pool.c -lpthread

关键注意事项

  • 任务函数内部不应访问共享资源,除非自行加锁,否则容易引发竞态条件。
  • 动态分配的参数(如上面的id)需确保在任务执行完后才释放,避免悬空指针。
  • 条件变量配合while循环检查条件,防止虚假唤醒。
  • 线程安全的内存管理需谨慎,尤其是任务取消或异常退出时的资源清理。

基本上就这些。这个模型虽简单,但足以支撑大多数后台任务调度需求。根据实际需要可扩展为支持优先级队列、动态扩容线程数或定时任务等功能。不复杂但容易忽略细节。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

387

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

611

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

351

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

256

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

597

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

639

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

599

2023.09.22

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号