• 线程池的实现

    • 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. python datetime学习

    Python中处理时间的模块datetime, 这个模块里包含的类也叫datetime,所以要使用需要先import from datetime import datetime 获取当前日期和时间 d ...

  2. centos7 pptp 安装

    1  安装 ppp yum install -y ppp 2 安装 pptpd yum install -y pptpd 3 编辑/etc/pptpd.conf 在最后 添加 localip 192. ...

  3. 记一次挂马清除经历:处理一个利用thinkphp5远程代码执行漏洞挖矿的木马

    昨天发现 一台服务器突然慢了 top 显示 几个进程100%以上的cpu使用 执行命令为 : /tmp/php  -s /tmp/p2.conf 基本可以确定是被挂马了 下一步确定来源 last 没有 ...

  4. PHP 换行符 PHP_EOL

    PHP 中换行可以用 PHP_EOL 来替代,以提高代码的源代码级可移植性: unix系列用 \n windows系列用 \r\n mac用 \r <?php echo PHP_EOL; //w ...

  5. Linux下使用Quagga(Zebra)搭建路由器记录(转)

    写在前面 从22号中午开始琢磨zebra/quagga的用法,一直到晚上11点多都没有什么头绪.各种Google,百度,几近崩溃.由于网上关于zebra/quagga的配置方法都是在真实的若干台电脑上 ...

  6. Docker无法启动问题

    启动Docker出现如下错误: PolicyKit daemon disconnected from the bus.We are no longer a registered authenticat ...

  7. Ubuntu Nginx Ruby, Rails Mysql 安装

    1. Nginx 安装 sudo apt-get install nginx 2. Ruby 安装 sudo apt-get install ruby 查看版本 ruby -v 3. Rails 安装 ...

  8. ASP.NET AJAX入门系列(8):自定义异常处理

    在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档. ...

  9. flume-ng-sql-source实现oracle增量数据读取

    一.下载编译flume-ng-sql-source 下载地址:https://github.com/keedio/flume-ng-sql-source.git ,安装说明文档编译和拷贝jar包 嫌麻 ...

  10. Spring Cloud(Dalston.SR5)--Eureka 服务实例健康检查

    默认情况下,Eureka 客户端每隔 30 秒会发送一次心跳给服务器端,告知正常存活,但是,实际环境中有可能出现这种情况,客户端表面上可以正常发送心跳,但实际上服务是不可用的,例如,一个需要访问数据的 ...