linux线程池浅谈

简介: linux线程池浅谈

本篇文章我们来讲一下linux进程 线程 线程池的内容

以下是linux线程池使用的思维导图:

Linux进程是程序执行的一个实例,是系进统行资源分配和调度的基本单位。进程是动态的,有生命周期及运行状态,是程序运行的动态过程

Linux线程池的介绍:

Linux线程池(Thread Pool)是一种线程使用模式,它预先创建并维护多个线程,这些线程等待任务到来时,从线程池中选取一个线程来执行任务。线程池通过减少线程的创建和销毁次数,降低了开销,提高了系统的响应速度和吞吐量。

在Linux环境下,线程池的实现通常依赖于系统提供的线程库,如pthread。线程池中的线程在初始状态下可能处于休眠状态,不消耗CPU,但占用较小的内存空间。当新任务到来时,线程池管理器会选择一个空闲线程来执行任务。如果线程池中没有空闲线程,线程池管理器会新建一定数量的线程来处理任务。当系统比较空闲时,线程池管理器会自动销毁一部分线程,回收系统资源。

线程池的优点包括:

  1. 降低开销:通过复用线程,避免了频繁地创建和销毁线程,减少了系统开销。
  2. 提高性能:线程池中的线程可以被多个任务共享,提高了系统的并发处理能力。
  3. 简化编程:线程池将线程的创建、管理和销毁等底层细节封装起来,简化了开发者的编程工作。

在Linux中,线程池通常用于处理大量并发任务,如WEB服务器处理网页请求等场景。通过合理使用线程池,可以显著提高系统的性能和稳定性。

linux线程池的创建和使用实例:

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
#include <unistd.h>  
  
#define MAX_THREADS 10  
#define QUEUE_SIZE 100  
  
typedef struct task {  
    void (*func)(void* arg);  
    void* arg;  
    struct task* next;  
} task_t;  
  
typedef struct thread_pool {  
    pthread_mutex_t lock;  
    pthread_cond_t cond;  
    int thread_count;  
    int task_count;  
    task_t* task_queue;  
    pthread_t* threads;  
} thread_pool_t;  
  
void* worker(void* arg) {  
    thread_pool_t* pool = (thread_pool_t*) arg;  
    while (1) {  
        pthread_mutex_lock(&pool->lock);  
        while (pool->task_count == 0) {  
            pthread_cond_wait(&pool->cond, &pool->lock);  
        }  
        task_t* task = pool->task_queue;  
        pool->task_queue = task->next;  
        pool->task_count--;  
        pthread_mutex_unlock(&pool->lock);  
        task->func(task->arg);  
        free(task);  
    }  
    return NULL;  
}  
  
thread_pool_t* create_pool(int num_threads) {  
    thread_pool_t* pool = (thread_pool_t*) malloc(sizeof(thread_pool_t));  
    pool->task_queue = NULL;  
    pool->task_count = 0;  
    pool->thread_count = 0;  
    pool->threads = (pthread_t*) malloc(num_threads * sizeof(pthread_t));  
    pthread_mutex_init(&pool->lock, NULL);  
    pthread_cond_init(&pool->cond, NULL);  
    for (int i = 0; i < num_threads; i++) {  
        pthread_create(&pool->threads[i], NULL, worker, pool);  
        pool->thread_count++;  
    }  
    return pool;  
}  
  
void add_task(thread_pool_t* pool, void (*func)(void* arg), void* arg) {  
    task_t* task = (task_t*) malloc(sizeof(task_t));  
    task->func = func;  
    task->arg = arg;  
    task->next = NULL;  
    pthread_mutex_lock(&pool->lock);  
    if (pool->task_count == QUEUE_SIZE) {  
        fprintf(stderr, "Error: task queue is full\n");  
        pthread_mutex_unlock(&pool->lock);  
        free(task);  
        return;  
    }  
    if (pool->task_queue == NULL) {  
        pool->task_queue = task;  
    } else {  
        task_t* last = pool->task_queue;  
        while (last->next != NULL) {  
            last = last->next;  
        }  
        last->next = task;  
    }  
    pool->task_count++;  
    pthread_cond_signal(&pool->cond);  
    pthread_mutex_unlock(&pool->lock);  
}  
  
void destroy_pool(thread_pool_t* pool) {  
    pthread_mutex_lock(&pool->lock);  
    while (pool->task_count > 0) {  
        pthread_cond_wait(&pool->cond, &pool->lock);  
    }  
    pthread_mutex_unlock(&pool->lock);  
    for (int i = 0; i < pool->thread_count; i++) {  
        pthread_join(pool->threads[i], NULL);  
    }  
    free(pool->threads);  
    pthread_mutex_destroy(&pool->lock);  
    pthread_cond_destroy(&pool->cond);  
    free(pool);  
}  
  
void print_num(void* arg) {  
    int num = *(int*) arg;  
    printf("%d\n", num);  
}  
  
int main() {  
    thread_pool_t* pool = create_pool(MAX_THREADS);  
    for (int i = 0; i < 20; i++) {  
        int* num = (int*) malloc(sizeof(int));  
        *num = i;  
        add_task(pool, print);
}

总结:本篇文章主要是讲述了linux线程池的概念和使用 线程池是大量线程的聚集体 能够优化性能 减少耗时等等

好了 本篇文章就到这里结束了 在这里我想向大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
5月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
125 1
|
3月前
|
算法 Unix Linux
linux线程调度策略
linux线程调度策略
78 0
|
1月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
29 0
Linux C/C++之线程基础
|
1月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
3月前
|
存储 设计模式 NoSQL
Linux线程详解
Linux线程详解
|
3月前
|
缓存 Linux C语言
Linux线程是如何创建的
【8月更文挑战第5天】线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。
|
3月前
|
负载均衡 Linux 调度
在Linux中,进程和线程有何作用?
在Linux中,进程和线程有何作用?
|
3月前
|
缓存 Linux C语言
Linux中线程是如何创建的
【8月更文挑战第15天】线程并非纯内核机制,由内核态与用户态共同实现。
|
5月前
|
API
linux---线程互斥锁总结及代码实现
linux---线程互斥锁总结及代码实现
|
5月前
|
Linux API
Linux线程总结---线程的创建、退出、取消、回收、分离属性
Linux线程总结---线程的创建、退出、取消、回收、分离属性