欢迎访问宝典百科,专注于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系统中,以.开头的文件被称为隐藏文件或点文件(Dot Files)。这类文件在系统管理、应用程序配置和用户个性化设置中扮演着核心角色。本文将深入探讨其定义、用途和管理方法,并通过结构化数据辅助理解。一、点文件
    2025-12-02 linux 4685浏览
  • 在Linux系统中,root用户拥有最高权限,而日常操作建议使用普通用户账户以提升系统安全性。本文从专业角度解析如何从root切换为普通用户、管理用户账户与密码策略,并提供扩展的安全实践方案。一、从root切换到普通用户的
    2025-12-02 linux 7533浏览
栏目推荐
  • 在现代计算机使用场景中,Linux系统因其开源特性、稳定性及强大的命令行工具受到广泛欢迎。然而,传统虚拟机(如VMware、VirtualBox等)的安装和配置往往对初学者来说存在门槛,且占用较多系统资源。本文将探讨不用虚拟机的
    2025-10-10 linux 3257浏览
  • Linux有FileZilla吗?这是许多Linux用户在使用FTP或SFTP协议进行文件传输时常常提出的疑问。FileZilla本身是一款开源的FTP客户端,其跨平台特性使得它支持多种操作系统,包括Windows、macOS和Linux。本文将围绕Linux系统中如何安装和使用
    2025-10-10 linux 130浏览
  • Linux怎么在PE下安装驱动Windows Preinstallation Environment(Windows PE)是一种轻量级的Windows操作系统,常用于系统部署、诊断和维护。在某些情况下,用户可能需要在PE环境中为Linux系统安装驱动,例如修复Linux驱动兼容性问题、调试硬
    2025-10-09 linux 1787浏览
全站推荐
  • 在移动设备领域,32位模式与64位模式的转换曾是技术热点,但对于苹果iPhone用户而言,这一问题存在特殊限制。本文将深入解析苹果手机处理器架构演变及其对系统模式的影响,并通过结构化数据揭示技术细节。一、苹果手机
    2025-12-01 苹果 4977浏览
  • 手机断WiFi怎么设置在移动互联网时代,WiFi连接已成为手机使用的基础功能。但频繁断连、网络不稳定等问题严重影响用户体验。本文将从专业角度解析手机WiFi断连的机制,并提供系统化的解决方案设置指南。 断连原因类型占
    2025-12-01 WIFI 9892浏览
  • 当光猫(光纤调制解调器)被意外重置后,网络连接将中断。本文提供专业解决方案及结构化数据,帮助用户快速恢复网络。光猫重置后的主要影响与核心恢复步骤重置会导致宽带账户信息、VLAN设置和Wi-Fi配置丢失。需按以下流
    2025-12-01 光猫 7295浏览
友情链接
底部分割线