• 线程池的实现

    • 1:自定义封装的条件变量

      •  //condition.h
        #ifndef _CONDITION_H_
        #define _CONDITION_H_ #include <pthread.h> typedef struct condition
        {
        pthread_mutex_t pmutex;
        pthread_cond_t pcond;
        }condition_t; int condition_init(condition_t *cond);
        int condition_lock(condition_t *cond);
        int condition_unlock(condition_t *cond);
        int condition_wait(condition_t *cond);
        int condition_timewait(condition_t *cond,const struct timespec *abstime);
        int condition_signal(condition_t *cond);
        int condition_broadcast(condition_t *cond);
        int condition_destroy(condition_t *cond); #endif
      •  //condition.c
        #include "condition.h" int condition_init(condition_t *cond)
        {
        int status;
        if((status = pthread_mutex_init(&cond->pmutex,NULL)))
        return status;
        if((status = pthread_cond_init(&cond->pcond,NULL)))
        return status;
        return ;
        } int condition_lock(condition_t *cond)
        {
        return pthread_mutex_lock(&cond->pmutex);
        }
        int condition_unlock(condition_t *cond)
        {
        return pthread_mutex_unlock(&cond->pmutex);
        }
        int condition_wait(condition_t *cond)
        {
        return pthread_cond_wait(&cond->pcond,&cond->pmutex);
        }
        int condition_timewait(condition_t *cond,const struct timespec *abstime)
        {
        return pthread_cond_timedwait(&cond->pcond,&cond->pmutex,abstime);
        }
        int condition_signal(condition_t *cond)
        {
        return pthread_cond_signal(&cond->pcond);
        }
        int condition_broadcast(condition_t *cond)
        {
        return pthread_cond_broadcast(&cond->pcond);
        }
        int condition_destroy(condition_t *cond)
        {
        int status;
        if((status = pthread_mutex_destroy(&cond->pmutex)))
        return status;
        if((status = pthread_cond_destroy(&cond->pcond)))
        return status;
        return ; }
    • 2:线程池逻辑
      •  //threadpool.h
        #include "condition.h" typedef struct task
        {
        void *(*run)(void *arg);
        void *arg;
        struct task *next;
        }task_t; typedef struct threadpool
        {
        condition_t ready;
        task_t *first;
        task_t *last;
        int counter;
        int idle;
        int max_threads;
        int quit;
        }threadpool_t; void threadpool_init(threadpool_t *pool, int threads); void threadpool_add_task(threadpool_t *pool,void *(*run)(void *arg),void *arg); void threadpool_destroy(threadpool_t *pool);
      • //threadpool.c
        #include "threadpool.h"
        #include <string.h>
        #include <errno.h>
        #include <time.h> void *thread_routine(void *arg)
        {
        printf("thread 0x%0x is starting\n",(int)pthread_self());
        struct timespec abstime;
        int timeout; threadpool_t *pool = (threadpool_t*)arg;
        while()
        {
        timeout = ;
        condition_lock(&pool->ready);
        pool->idle++;
        while(pool->first == NULL && pool->quit)
        {
        // condition_wait(&pool->ready);
        clock_gettime(CLOCK_REALTIME, &abstime);
        abstime.tv_sec += ;
        int status = condition_timewait(&pool->ready,&abstime);
        if(status == ETIMEDOUT)
        {
        printf("thread time out\n");
        timeout = ;
        break;
        }
        } pool->idle--;
        if(pool->first != NULL)
        {
        task_t *t = pool->first;
        pool->first = t->next;
          //由于执行下线程工作需要时间,所以先解锁以让其他线程能过获取资源
        condition_unlock(&pool->ready);
        t->run(t->arg);
        free(t);
        condition_lock(&pool->ready);
        } if(pool->quit && pool->first == NULL)
        {
        pool->counter--;
        if(pool->counter == )
        {
        condition_signal(&pool->ready);
        }
        condition_unlock(&pool->ready);
        break;
        } if(timeout && pool->first == NULL)
        {
        pool->counter--;
        condition_unlock(&pool->ready);
        break;
        }
        condition_unlock(&pool->ready);
        } printf("thead 0x%0x is exting\n",(int)pthread_self());
        return NULL;
        }
        void threadpool_init(threadpool_t *pool, int threads)
        {
        // condition_t ready;
        // task_t *first;
        // task_t *last;
        // int counter;
        // int idle;
        // int max_threads;
        // int quit; condition_init(&pool->ready);
        pool->first = NULL;
        pool->last = NULL;
        pool->counter= ;
        pool->idle = ;
        pool->max_threads = threads;
        pool->quit = ;
        } void threadpool_add_task(threadpool_t *pool,void *(*run)(void *arg),void *arg)
        {
        task_t* newtask = malloc(sizeof(task_t));
        newtask->run = run;
        newtask->arg = arg;
        newtask->next = NULL; condition_lock(&pool->ready); //add task to tasklist tail
        if(pool->first ==NULL)
        pool->first = newtask;
        else
        pool->last->next = newtask;
        pool->last = newtask; // if have wait thread,wake to do work
        if(pool->idle > )
        {
        condition_signal(&pool->ready);
        }
        else if(pool->counter < pool->max_threads)
        {
        pthread_t tid;
        pthread_create(&tid, NULL, thread_routine, pool);
        pool->counter++;
        } condition_unlock(&pool->ready);
        } void threadpool_destroy(threadpool_t *pool)
        {
        if(pool->quit)
        {
        return;
        }
        condition_lock(&pool->ready);
        pool->quit = ;
        if(pool->counter > )
        {
        if(pool->idle > )
        {
        condition_broadcast(&pool->ready);
        } while(pool->counter > )
        {
        condition_wait(&pool->ready);
        }
        }
        condition_unlock(&pool->ready);
        condition_destroy(&pool->ready);
        }
    • 3:main

      •  #include "threadpool.h"
        #include <unistd.h>
        #include <stdio.h>
        #include <stdlib.h> void* mytask(void* arg)
        {
        printf("thread 0x%0x is working on task %d\n",(int)pthread_self(),*(int*)arg);
        sleep();
        free(arg);
        return NULL;
        } int main(void)
        {
        threadpool_t pool;
        threadpool_init(&pool,); int i;
        for(i = ; i < ; i++)
        {
        int *arg = (int*)malloc(sizeof(int));
        *arg = i;
        threadpool_add_task(&pool,mytask,arg);
        }
        // sleep(15);
        threadpool_destroy(&pool);
        return ;
        }

Linux线程池的实现的更多相关文章

  1. linux线程池thrmgr源码解析

    linux线程池thrmgr源码解析 1         thrmgr线程池的作用 thrmgr线程池的作用是提高程序的并发处理能力,在多CPU的服务器上运行程序,可以并发执行多个任务. 2      ...

  2. 一个简单的linux线程池(转-wangchenxicool)

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  3. 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量

    线程池的含义跟它的名字一样,就是一个由许多线程组成的池子. 有了线程池,在程序中使用多线程变得简单.我们不用再自己去操心线程的创建.撤销.管理问题,有什么要消耗大量CPU时间的任务通通直接扔到线程池里 ...

  4. linux线程池

    typedef struct task_node { void *arg; /* fun arg. */ void *(*fun) (void *); /* the real work of the ...

  5. Linux线程池在server上简单应用

    一.问题描写叙述 如今以C/S架构为例.client向server端发送要查找的数字,server端启动线程中的线程进行对应的查询.将查询结果显示出来. 二.实现方案 1. 整个project以cli ...

  6. Linux下简易线程池

    线程池简介 线程池是可以用来在后台执行多个任务的线程集合. 这使主线程可以自由地异步执行其他任务.线程池通常用于服务器应用程序. 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会 ...

  7. 线程池(Linux实现)

    讨论QQ群:135202158 本文技术参考了sourceforge项目c thread pool,链接:http://sourceforge.net/projects/cthpool/ 线程池如上一 ...

  8. Linux平台下线程池的原理及实现

    转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...

  9. 高效线程池之无锁化实现(Linux C)

    from:http://blog.csdn.net/xhjcehust/article/details/45844901 笔者之前练手写过一个小的线程池版本(已上传至https://github.co ...

随机推荐

  1. 深入详解美团点评CAT跨语言服务监控(三)CAT客户端原理

    cat客户端部分核心类 message目录下面有消息相关的部分接口 internal目录包含主要的CAT客户端内部实现类: io目录包含建立服务端连接.重连.消息队列监听.上报等io实现类: spi目 ...

  2. 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新

    大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...

  3. bind智能DNS + bindUI管理系统

    bind UI 管理系统 https://github.com/cucker0/BindUI # bind安装 cd /usr/local/src wget http://ftp.isc.org/is ...

  4. flume简介

    组件介绍: 代理 Flume Agent Flume内部有一个或者多个Agent 每一个Agent是一个独立的守护进程(JVM) 从客户端哪儿接收收集,或者从其他的Agent哪儿接收,然后迅速的将获取 ...

  5. ES查询之刨根问底

    昨天有一个需求,就是想要根据某个网关url做过滤,获取其下面所有的上下文nginx日志:如果直接"query":"https://XXX/YYY/ZZZ"发现有 ...

  6. Jenkins进阶-应用的远程部署(12)

    越来越多的公司部署需要实现自动化模式,大家的首选的工具就是Jenkins,下来介绍下通过Publish Over SSH Plugin插件实现远程部署: 一.安装插件Publish Over SSH ...

  7. Maven+Eclipse+SparkStreaming+Kafka整合

    版本号: maven3.5.0     scala IDE for Eclipse:版本(4.6.1)    spark-2.1.1-bin-hadoop2.7    kafka_2.11-0.8.2 ...

  8. CentOS6.4 添加php-fpm系统服务

    简介: php-fpm安装完成后默认不会注册为系统服务,所以需要手工添加系统服务脚本.在/etc/init.d目录下新建php-fpm文件,并更改权限其即可. 1.检测/usr/local/php/v ...

  9. eclipse中maven运行run as clean等没反应处理方式

    在jdk配置处添加参数: -Dmaven.multiModuleProjectDirectory=$MAVEN_HOME 注意:这里有一个前提就是你已经正确安装maven [在环境变量中添加MAVEN ...

  10. EXPLAIN执行计划中要重点关注哪些要素

    MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: 列名 备注 type 本次查询表联接类型,从这里可以 ...