• 线程池的实现

    • 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. C# to IL 18 Glossary(术语)

  2. DevExpress Cpicturebox或者Dev控件 PictureEdit 按比例的缩放加载图片

    方法一:     如果要加载的图片的长宽比不是太过失衡, 1.可以改变picturebox的SizeMode属性为 PictureBoxSizeMode.StretchImage, 2.或者Dev控件 ...

  3. pdf.js 的使用

    现在的浏览器基本都支持直接把 pdf 文件拖到浏览器就可以打开,不用下载pdf阅读插件,但是在写网页的时候遇到了 pdf 文件怎么办呢,有两种解决办法,一种是用 falsh 来向用户展示,优点就是支持 ...

  4. 在linux环境下,php语法出错,怎样让php编译后提示编译错误,错误在哪?

    如果不具备修改php.ini的权限,可以如下:ini_set("display_errors", "On"); error_reporting(E_ALL |  ...

  5. php路径常量

    我们知道PHP中提供了一个魔术常量(magic constant)__FILE__,用来指向当前执行的PHP脚本.但PHP没有直接提供该脚本所在目录的常量.也就是说如果我们要得到当前PHP脚本所在的目 ...

  6. $("#form1"). serialize()提交表单

    一.jQuery ajax()使用serialize()提交form数据 jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直 ...

  7. 自然语言处理工具hanlp关键词提取图解TextRank算法

    看一个博主(亚当-adam)的关于hanlp关键词提取算法TextRank的文章,还是非常好的一篇实操经验分享,分享一下给各位需要的朋友一起学习一下! TextRank是在Google的PageRan ...

  8. Mysql权限速查表以及权限详解

    一.前言 很多文章中会说,数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话.因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪 些权限. 现在很多mysql用着root账户 ...

  9. 第一个NDK工具:AddInputsSol

    工具名称:AddInputsSol 系统平台:Windows 7x64 软件平台:Nuke8.0v5x64 基本功能:分别获取AddInputsSol节点上游的framerange信息,点击Rende ...

  10. ipconfig/all详解

    Ipconfig/all(win+R-->cmd-->ipconfig/all)最常用的就是显示自己主机的ip了,可以让我们了解自己的计算机是否成功的租用到一个IP地址.但是ipconfi ...