linux pthread_t线程池的设计与实现

在Linux中,使用pthread_t实现线程池需要以下几个步骤:定义线程池结构体:#include #include typedef struct Task {void (*func)(void *);void *arg;struct Task *next;} Task;typedef struct ThreadPool {pthread_mute

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

  1. 定义线程池结构体:
#include <pthread.h>
#include <stdbool.h>

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的线程池就设计和实现完成了。你可以根据自己的需求调整线程池的大小、队列大小等参数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/1132965.html

(0)
派派
上一篇 2024-09-05
下一篇 2024-09-05

相关推荐

  • sqlserver端口号怎么查看

    要查看SQL Server的端口号,可以通过以下方式之一来查看:通过SQL Server配置工具查看:打开SQL Server Configuration Manager。在左侧导航栏中选择SQL Server网络配置。在右侧窗口中选择相应的实例,然后在TCP/IP节点下找到IP地址和端口号。通过SQL Server Management Studio (SSMS)查看:打开SSMS并连接到S

    2024-02-22
    0
  • 免备案香港服务器和美国服务器有什么区别

    免备案的香港服务器和美国服务器主要区别在于数据隐私和网络速度。数据隐私:香港是一个相对开放和尊重隐私的地区,政府对互联网内容审查相对宽松,保护用户数据隐私的法律法规相对健全。而美国在一些情况下可能会出于国家安全或其他目的要求服务器提供商提供用户数据,可能会对用户数据隐私造成一定风险。网络速度:一般来说,香港到中国大陆的网络连接速度会比较快,而美国到中国大陆的网络连接速度可能会受距离等因素影响而有

    2024-05-09
    0
  • c++ arcsin在实际中的应用场景

    在实际中,c++中的arcsin函数可以用于计算角度的反正弦值。这在计算机图形学、游戏开发、物理学、工程等领域中非常常见。例如,在计算机图形学中,arcsin函数常用于计算物体在3D空间中的旋转角度,以及处理相机的角度和视角等问题。在物理学中,arcsin函数可以用于计算角度的反正弦值,以便于求解各种物理问题中的角度关系。在工程领域中,arcsin函数也可以用于解决各种工程问题中的角度计算和转换等

    2024-08-21
    0
  • 如何查看Linux系统的状态信息

    要查看Linux系统的状态信息,可以使用以下命令:top:显示系统当前正在运行的进程列表和资源占用情况,包括CPU使用率、内存占用情况等。htop:类似于top命令,但提供了更加直观和易用的界面,可以交互式地查看和管理进程。free:显示系统内存的使用情况,包括总内存、已使用内存、空闲内存等。df:显示系统磁盘空间的使用情况,包括总空间、已用空间、可用空间等。vmstat:显示系统的虚拟内存情况,

    2024-06-12
    0
  • Java中stdin读取的性能优化

    在Java中通过System.in进行标准输入(stdin)读取数据时,可以通过以下方法对性能进行优化:使用BufferedReader包装System.in,可以减少IO操作次数,提高读取效率。示例代码如下:BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String line = nul

    2024-08-24
    0
  • Android中RAM和ROM的区别是什么

    RAM(Random Access Memory)和ROM(Read-Only Memory)是两种不同类型的存储器件,它们在Android系统中起着不同的作用。RAM(随机存储器):RAM是一种临时存储器,用于临时存储运行中的应用程序、数据和系统进程。RAM是易失性存储器,意味着当设备关闭或重启时,RAM中的数据会被清除。RAM决定了设备的运行速度和多任务处理能力,RAM越大,设备的运行效率

    2024-05-29
    0

发表回复

登录后才能评论