欢迎访问宝典百科,专注于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虚拟机配置正确的主机IP地址是实现网络通信和资源访问的关键步骤。本文将详细阐述不同网络模式下(如NAT模式、桥接模式、仅主机模式)的IP设置方法,涵盖命令行工具及配置文件操作,并提供结构化
    2026-02-02 linux 8186浏览
  • 本文旨在探讨一个常被误解的话题:Linux系统为什么没发展起来。实际上,Linux并非“没发展起来”,而是其发展路径与商业形态与Windows、macOS等主流系统存在显著差异。本文将从历史背景、市场定位、技术生态、用户群体等多
    2026-02-02 linux 9017浏览
栏目推荐
  • Linux SSH 怎么登陆在Linux系统管理和服务器运维领域,SSH(Secure Shell)协议是进行远程安全登录和管理的基石。它是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境,完全替代了早期的Telnet等不安
    2025-12-23 linux 1166浏览
  • 在科学计算、数据分析、机器学习等领域,矩阵计算是一项核心任务。对于许多用户而言,专业的商业软件如MATLAB虽然功能强大,但成本高昂。而Linux作为开源、免费且高度可定制的操作系统,凭借其强大的命令行工具、丰富的
    2025-12-23 linux 5022浏览
  • 在 Linux 系统管理和性能调优中,了解系统的内存使用情况是一项基础且至关重要的任务。无论是排查系统瓶颈、规划硬件升级,还是确保关键应用有足够资源运行,掌握如何准确查看和解析内存信息都是系统管理员和开发者的
    2025-12-22 linux 5994浏览
全站推荐
  • 对于摄影爱好者和专业用户而言,松下相机是高性能和可靠性的代名词。然而,市场混杂,无论是全新还是二手交易,都存在翻新机、水货冒充行货,甚至完全伪造产品的风险。掌握一套系统性的真伪验证方法,是保障自身权益
    2026-01-29 松下 3602浏览
  • # 富士XT5相机怎么查看富士XT5是一款备受摄影爱好者喜爱的无反相机,凭借其小巧便携的设计和强大的性能,成为许多摄影师的首选设备。然而,对于刚接触富士相机的用户来说,如何查看相机的各项功能和参数可能会显得有些
    2026-01-29 富士 5130浏览
  • # 索尼相机不聚焦了怎么办呢索尼相机作为一款备受推崇的高端相机品牌,其对焦系统一直以精准和快速著称。然而,有时候用户可能会遇到相机不聚焦的问题,这可能是由于多种原因引起的。本文将从专业角度分析索尼相机不
    2026-01-29 索尼 4471浏览
友情链接
底部分割线