legongju.com
我们一直在努力
2025-01-10 23:06 | 星期五

linux pthread_t线程池的设计与实现

在Linux中,使用pthread_t实现线程池需要以下几个步骤:

  1. 定义线程池结构体:
#include 
#include 

typedef struct Task {
    void (*func)(void *);
    void *arg;
    struct Task *next;
} Task;

typedef struct ThreadPool {
    pthread_mutex_t lock;
    pthread_cond_t cond;
    pthread_t *threads;
    Task *head;
    Task *tail;
    int thread_count;
    int queue_size;
    bool shutdown;
} ThreadPool;
  1. 初始化线程池:
ThreadPool *threadpool_init(int thread_count, int queue_size) {
    ThreadPool *pool = (ThreadPool *)malloc(sizeof(ThreadPool));
    pool->threads = (pthread_t *)malloc(sizeof(pthread_t) * thread_count);
    pool->head = NULL;
    pool->tail = NULL;
    pool->thread_count = thread_count;
    pool->queue_size = queue_size;
    pool->shutdown = false;

    pthread_mutex_init(&pool->lock, NULL);
    pthread_cond_init(&pool->cond, NULL);

    for (int i = 0; i< thread_count; i++) {
        pthread_create(&pool->threads[i], NULL, threadpool_worker, (void *)pool);
    }

    return pool;
}
  1. 线程池工作函数:
void *threadpool_worker(void *arg) {
    ThreadPool *pool = (ThreadPool *)arg;
    while (1) {
        pthread_mutex_lock(&pool->lock);
        while (pool->head == NULL && !pool->shutdown) {
            pthread_cond_wait(&pool->cond, &pool->lock);
        }

        if (pool->shutdown) {
            pthread_mutex_unlock(&pool->lock);
            pthread_exit(NULL);
        }

        Task *task = pool->head;
        pool->head = task->next;
        if (pool->head == NULL) {
            pool->tail = NULL;
        }
        pthread_mutex_unlock(&pool->lock);

        task->func(task->arg);
        free(task);
    }
}
  1. 添加任务到线程池:
void threadpool_add_task(ThreadPool *pool, void (*func)(void *), void *arg) {
    Task *task = (Task *)malloc(sizeof(Task));
    task->func = func;
    task->arg = arg;
    task->next = NULL;

    pthread_mutex_lock(&pool->lock);
    if (pool->tail) {
        pool->tail->next = task;
    } else {
        pool->head = task;
    }
    pool->tail = task;
    pthread_cond_signal(&pool->cond);
    pthread_mutex_unlock(&pool->lock);
}
  1. 销毁线程池:
void threadpool_destroy(ThreadPool *pool) {
    pthread_mutex_lock(&pool->lock);
    pool->shutdown = true;
    pthread_cond_broadcast(&pool->cond);
    pthread_mutex_unlock(&pool->lock);

    for (int i = 0; i< pool->thread_count; i++) {
        pthread_join(pool->threads[i], NULL);
    }

    while (pool->head) {
        Task *task = pool->head;
        pool->head = task->next;
        free(task);
    }

    pthread_mutex_destroy(&pool->lock);
    pthread_cond_destroy(&pool->cond);
    free(pool->threads);
    free(pool);
}

这样,一个基于pthread_t的线程池就设计和实现完成了。你可以根据自己的需求调整线程池的大小、队列大小等参数。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/100246.html

相关推荐

  • linux用gcc编译完怎么运行

    linux用gcc编译完怎么运行

    在Linux系统中,使用GCC编译器编译C或C++代码后,你可以按照以下步骤运行生成的可执行文件: 打开终端(Terminal)。 使用cd命令导航到包含可执行文件的目录。例...

  • linux怎么连接redis集群

    linux怎么连接redis集群

    在Linux上连接Redis集群,你需要遵循以下步骤: 安装Redis客户端库:首先,你需要为你的编程语言安装一个Redis客户端库。这里以Python为例,你需要安装redis-py-...

  • 如何优化Linux中Logstash的性能

    如何优化Linux中Logstash的性能

    为了优化Linux中Logstash的性能,可以从多个方面进行调整。以下是一些关键步骤和配置建议:
    优化Logstash性能的方法 调整工作线程数和批量处理大小:根据服...

  • Linux下Logstash日志处理技巧

    Linux下Logstash日志处理技巧

    Logstash 是一个开源的日志管理工具,它可以帮助你收集、分析和存储来自各种来源的日志数据 使用 Grok 过滤器解析日志:Grok 是 Logstash 中的一个过滤器,可以帮...

  • pthread_t在linux多线程编程中的作用

    pthread_t在linux多线程编程中的作用

    pthread_t 是一个数据类型,在 Linux 多线程编程中,它表示一个线程的标识符
    当你使用 POSIX 线程库(pthread)创建一个新线程时,你需要提供一个 pthread_...

  • linux pthread_t线程同步方法

    linux pthread_t线程同步方法

    在Linux中,pthread_t是一个用于表示线程的数据类型 互斥锁(Mutex):互斥锁是一种同步原语,用于保护共享资源免受多个线程的并发访问。当一个线程获得互斥锁时...

  • socket5在linux中的工作原理是什么

    socket5在linux中的工作原理是什么

    实际上,并没有“socket5”这一概念。在Linux中,我们通常使用的是TCP/IP协议族中的“socket”接口,它支持多种网络协议,包括TCP、UDP等。以下是关于Linux中soc...

  • linux pthread_t线程的资源管理技巧

    linux pthread_t线程的资源管理技巧

    在Linux中,pthread_t是一个用于表示线程的数据类型 创建线程时,使用pthread_create()函数。确保为新线程分配足够的栈空间,以避免栈溢出。可以通过设置pthread...