线程与线程池

在这里插入图片描述
学习自:
https://www.cnblogs.com/firstForEver/p/7193658.html
https://blog.csdn.net/qq_36359022/article/details/78796784

线程是C库里已经定义了的一种数据结构,定义在pthread.h头文件中,数据类型为:pthread_t

Task数据结构理解:

struct Task
{
    void (*fnTaskExec)(void *pTaskData);
    void *pTaskData;
} Task;

该数据结构包含两个参数,一个是指向某值(这个值可以是任意类型故用viod)的指针:pTaskData,一个是指向某函数的指针:fnTaskExec(指向函数指针定义为:void (*p)(void x),x可写可不写,void表示任意类型)

此题应该要写三个函数:
1.单个线程任务队列处理函数t:hreadpool_thread
2.线程池创建线程函数:admin_thread
3.追加任务函数:threadpool_add_task

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

///任务数据结构
typedef struct Task
{
    void (*fnTaskExec)(void *pTaskData);
    void *pTaskData;
} Task;


///线程池数据结构
typedef struct threadpool_t
{
    pthread_t *threads;//存放若干工作线程的数组
    int thread_num;//线程池中在工作的线程数
    
    Task *task_queue;//任务队列
    int queue_front;//队头
    int queue_rear;//队尾
    int queue_max_size;//队列能容纳的最大任务数
} threadpool_t;

void *admin_thread(void *threadpool);///线程管理函数:线程建立并工作
void *threadpool_thread(threadpool_t *pool);///线程的任务队列处理函数:取任务,执行
int threadpool_add_task(threadpool_t *pool, void *(*fnTaskExec)(void *pTaskData), void *pTaskData);/*向线程池的任务队列中添加一个任务函数 */


///线程管理函数:线程建立并工作,线程建立其实就开始工作了
void *admin_thread(void *threadpool)
{
    int i;
    threadpool_t *pool = (threadpool_t *)malloc(sizeof(threadpool_t));
    scanf("%d",&pool->thread_num);//开启thread_num个线程
    /*一次增加thread_num个线程*/
    for (i=0; i<pool->thread_num; i++)
    {
        pthread_create(&(pool->threads[i]), NULL, threadpool_thread, (void *)pool);
    }

}

///线程的任务队列处理函数:取任务,执行
void *threadpool_thread(threadpool_t *pool)//参数为某线程及线程池指针
{
    Task task;

    ///队列为空,无任务则休眠
    while ((pool->queue_rear ==pool->queue_front))
    {
        sleep(1000);//休眠1秒 
    }

    ///否则该线程可以拿出任务
    pool->queue_front = (pool->queue_front + 1) % pool->queue_max_size;  //队头移动
    task.fnTaskExec = pool->task_queue[pool->queue_front].fnTaskExec; //出队操作
    task.pTaskData = pool->task_queue[pool->queue_front].pTaskData;
    (*task.fnTaskExec)(task.pTaskData);                           //执行任务
}

/*向线程池的任务队列中添加一个任务函数 */
int threadpool_add_task(threadpool_t *pool, void *(*fnTaskExec)(void *pTaskData), void *pTaskData)
{
    /*如果队列满了,调用wait阻塞*/
    while ((pool->queue_rear + 1) % pool->queue_max_size==pool->queue_front)
    {
        pthread_cond_wait(&(pool->queue_not_full), &(pool->lock));
    }

    /*添加任务到任务队列*/
    pool->queue_rear = (pool->queue_rear + 1) % pool->queue_max_size;  /* 队尾后移动  */
    pool->task_queue[pool->queue_rear].fnTaskExec = fnTaskExec;
    pool->task_queue[pool->queue_rear].pTaskData = pTaskData;
    pool->queue_size++;
    return 0;
}



猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/84956004