• 线程池的实现

    • 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. Jenkins进阶-Slave 节点的配置(11)

    Jenkins的主节点无法满足当前的发布需求,所以我们需要增加一个从节点,我们是本着节约的模式,所以主从节点均需要有任务来进行构建: 1.系统管理->管理节点: 2.添加从节点,管理节点-> ...

  2. jmeter --- 监控器 Plugins (&jconsole)

    jmeter --- 监控器 Plugins (&jconsole) Jmeter本身没有监控服务器资源的功能,需要添加额外插件 一.监控原理图 二.Jmeter-Plugs下载和安装 官网上 ...

  3. Mac OS安装Windows各版本时注意事项(2014年后的Mac机相信会有这些问题)

    2014年后的Mac Mini安装Windows时候,会遇上更种坑,我这几天不断失败及尝试更种版本,各有心得体会,我写下来是为了避免大家遇到像我这种问题. (2014年之前的Mac Mini是否这样, ...

  4. js copy数组 对象

    js copy数组 slice  concat  浅拷贝 copy 对象 Object.assign({},obj);  es6 ie要用babel转 暴力copy 用JSON.parse(JSON. ...

  5. linux下recv 、send阻塞、非阻塞区别和用法

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  6. Espresso 开源了

    Google Testing Blog上发布了一篇博客,Espresso 开源了 http://googletesting.blogspot.com/2013/10/espresso-for-andr ...

  7. python selenium 模拟登陆百度账号

    代码: from selenium import webdriver url = 'https://passport.baidu.com/v2/?login' username = 'your_use ...

  8. react组件的数据传递

    在react中,为了解决html标签构建应用的不足,将公共的功能单独抽离成一个文件作为一个组件,在使用的地方按需引入,既然是组件彼此调用,就会涉及到父子组件的通信,下面主要来总结简单的组件通信. 1, ...

  9. vue过渡

    vue在插入.更新或者移除DOM时,提供了多种不同方式的应用过渡效果,下面主要总结一些常用的过渡. 单元素过渡(vue1.0) 我们常用的动画是css3的动画,在vue中依旧有效. <!DOCT ...

  10. hadoop MapReduce —— 输出每个单词所对应的文件

    下面是四个文件及其内容. 代码实现: Mapper: package cn.tedu.invert; import java.io.IOException; import org.apache.had ...