Linux下创建线程池

本文介绍了一个简单的Linux线程池实现方法,包括线程池结构定义、线程创建与管理函数,并通过示例展示了如何使用该线程池来执行任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下创建线程池

这里写图片描述
1.

#include <stdio.h>
#include <malloc.h>
#include <pthread.h>
#include <assert.h>

pthread_t *pthread_id;
typedef struct MyStruct
{
    void *(*function)(void *arg);
    void * arg;
    struct work_struct * next;
}work_struct;

typedef struct  pthread
{
    //线程锁
    pthread_mutex_t queue_lock;
    pthread_cond_t queue_ready;

    //定义最大线程数
    int max_pthread;
    //等待工作的链表
    work_struct *work_list;
    //等待工作的数目
    int work_num;
    //关闭线程的标志
    int flag;
    //线程ID
    pthread_t *pthreadid;
}pthread_pool;
static pthread_pool *pool = NULL;

//线程入口函数
void* function_entry(void *arg)
{
    printf("the is pthread ox%x\n", pthread_self());
    while (1)
    {
        //加锁
        pthread_mutex_lock(&(pool->queue_lock));
        /*
        *等待队列为0,flag为0----进程阻塞
        *flad为非0---------------进程退出
        *等待队列不为0,flag为0--创建工作
        */
        //1.进程阻塞
        while (pool->work_num == 0 && pool->flag == 0)
        {
            printf("the pthread is ox%x will wait\n", pthread_self());
            pthread_cond_wait(&(pool->queue_ready), &(pool->queue_lock));
        }
        //2.进程退出

        if (pool->flag!=0)
        {
            //先解锁
            pthread_mutex_unlock(&(pool->queue_lock));
            printf("the pthread will exit ox%x \n",pthread_self());
            //线程退出
            pthread_exit(NULL);
        }
        //3.创建工作
        printf("the pthread will to work ox%x\n",pthread_self());
        //判断是否满足条件
        assert(pool->work_num!=0);
        assert(pool->work_list!=NULL);
        //取出链表元素
        pool->work_num--;
        work_struct *work = pool->work_list;
        pool->work_list = work->next;
        pthread_mutex_unlock(&(pool->queue_lock));
        //执行函数
        (*(work->function))(work->arg);
        free(work);
        work = NULL;
    }
}

void creat_pthreadpool(int num)
{
    int i;
    //分配线程池空间
    pool = (pthread_pool *)malloc(sizeof(pthread_pool));
    //初始化锁和环境变量
    pthread_mutex_init(&(pool->queue_lock),NULL);
    pthread_cond_init(&(pool->queue_ready),NULL);
    //初始化结构
    pool->flag = 0;
    pool->max_pthread = num;
    pool->work_list = NULL;
    pool->work_num = 0;
    //分配线程空间
    pool->pthreadid = (pthread_t *)malloc(sizeof(pthread_t)*num);
    //创建线程
    for (i = 0;i < num;i++)
    {
        pthread_create(&(pool->pthreadid[i]),NULL,function_entry,NULL);
    }
}

void join_work(void *(*function)(void *arg),void *arg)
{
    //构造新任务
    work_struct *new_work = (work_struct *)malloc(sizeof(work_struct));
    new_work->arg = arg;
    new_work->function = function;
    new_work->next = NULL;
    pthread_mutex_lock(&(pool->queue_lock));
    //将任务加入到等待队列
    work_struct *tmpwork = pool->work_list;//取出头结点
    if (tmpwork!=NULL)
    {
        while (tmpwork->next!=NULL)
        {
            tmpwork = tmpwork->next;
        }
        tmpwork->next = new_work;
    }
    else
    {
        pool->work_list = new_work;
    }

    pool->work_num++;
    assert(pool->work_num!=0);
    assert(pool->work_list != NULL);
    pthread_mutex_unlock(&(pool->queue_lock));
    //唤醒等待中的线程
    pthread_cond_signal(&(pool->queue_ready));
}

void close_pool()
{
    int i;
    //标志置1
    pool->flag = 1;
    //唤醒所有等待中的线程
    pthread_cond_broadcast(&(pool->queue_ready));
    //等待正在执行的线程
    for (i = 0; i < pool->max_pthread; i++)
    {
        pthread_join(pool->pthreadid[i],NULL);
    }
    free(pool->pthreadid);
    //销毁队列
    work_struct *head = NULL;
    while (pool->work_list!=NULL)
    {
        head = pool->work_list;
        pool->work_list = head->next;
        free(head);
    }
    //销毁互斥锁和条件变量
    pthread_mutex_destroy(&(pool->queue_lock));
    pthread_cond_destroy(&(pool->queue_ready));

    free(pool);//由malloc创建
    //置空指针
    pool = NULL;
}

void print_t(int i)
{
    printf("the pthread is 0x%x,work is %d\n",pthread_self(),i);

}
void main()
{
    int i;
    //1.创建线程池
    creat_pthreadpool(5);
    //2.加入任务
    for (i = 0;i < 10;i++)
    {
        join_work(print_t,&i);
    }
    sleep(5);
    //3.关闭线程池
    close_pool();
}

程序运行结果图:
结果图

我尝试采用pthread_join代替sleep,结果失败了,pthread_join就一直得不到返回,希望解决此问题的大神留言下,谢谢

参考博客:http://blog.youkuaiyun.com/zouxinfox/article/details/3560891
http://blog.youkuaiyun.com/ithomer/article/details/6063067
http://blog.youkuaiyun.com/ithomer/article/details/5921003
http://blog.youkuaiyun.com/ithomer/article/details/5920936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值