TaskManagement.c 3.0 KB
/******************************
 * 
 *  JZsdk的任务管理模块
 * 
 * 
 * ***************************/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include "./TaskManagement.h"
#include <JZsdkLib.h>

#define THREAD_POOL_SIZE 5 // 线程池大小

typedef struct {
    pthread_t thread; // 线程           //调用的线程
    int is_busy; // 标识线程是否忙碌   
    t_JZsdk_TaskFuntionInput* task;   // 线程执行的任务
    pthread_mutex_t lock; // 互斥锁
    pthread_cond_t condition; // 条件变量
} t_ThreadPool;

static t_ThreadPool TaskPool[THREAD_POOL_SIZE];  //任务池子

static void* TaskManagement_ThreadFunction(void* arg);


/**************
 * 
 *  任务管理模块的初始化
 * 
 * ***************/
T_JZsdkReturnCode TaskManagement_Init()
{
    //1、创建任务池子
    for (int i = 0; i < THREAD_POOL_SIZE; i++) 
    {
        TaskPool[i].is_busy = 0;
        pthread_mutex_init(&TaskPool[i].lock, NULL);
        pthread_cond_init(&TaskPool[i].condition, NULL);
        pthread_create(&TaskPool[i].thread, NULL, TaskManagement_ThreadFunction, &TaskPool[i]);
    }
}

/**************
 * 
 *  任务的输入
 * 
 * ***************/
T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* data)
{
    //检阅是否有空余的任务线程
    int i = 0;
    for ( ; i < THREAD_POOL_SIZE; i++)
    {
        if (!TaskPool[i].is_busy) 
        {
            //检测到有空余的线程
            break;
        }
    }
    
    //没有多余的任务线程,退出该发送任务
    if (i >= THREAD_POOL_SIZE)
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    t_JZsdk_TaskFuntionInput *task = (t_JZsdk_TaskFuntionInput*)malloc(sizeof(t_JZsdk_TaskFuntionInput));
    if (task == NULL) 
    {
        // 处理内存分配失败的情况
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    task->task_function = task_function;
    task->args = data;

    //将发送内容放入任务
    TaskPool[i].task = task;
    TaskPool[i].is_busy = 1;
    pthread_cond_signal(&TaskPool[i].condition);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


//执行函数
static void* TaskManagement_ThreadFunction(void* arg) 
{
    t_ThreadPool* pool = (t_ThreadPool*)arg;

    JZSDK_LOG_DEBUG("TaskManagement_Thread Have Create");

    while (1) 
    {
        pthread_mutex_lock(&pool->lock);
        while (!pool->is_busy) 
        {
            pthread_cond_wait(&pool->condition, &pool->lock);
        }

        // 执行任务
        pthread_mutex_unlock(&pool->lock);
        
        if (pool->task->task_function != NULL) 
        {
            pool->task->task_function(pool->task->args);
        }

        // 执行完成,将状态置为未忙碌
        pthread_mutex_lock(&pool->lock);
        if (pool->task != NULL)
        {
            free(pool->task);
            pool->task = NULL;
        }
        pool->is_busy = 0;
        pthread_mutex_unlock(&pool->lock);
    }
    return NULL;
}