线程池的定义

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

什么时候需要创建线程池呢?

简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。

实现程序(未完成相关资源的释放操作)

/********************

	Pthread Pool
14/06/18 22:06 ********************/ #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <pthread.h> /* 任务节点结构 */
typedef struct node {
void (*func)(void *arg);
unsigned int *work_id;
struct node *next;
}TaskNode; /* 线程池结构 */
typedef struct {
pthread_cond_t ready;
pthread_mutex_t lock; struct node *task_head;
pthread_t *thread_id;
unsigned int cur_queue_size;
}PthreadPool; static PthreadPool *pool = NULL; /* 定义线程 */
void *thread_routine (void *arg)
{
while(1)
{
pthread_mutex_lock(&pool->lock); if(!pool->cur_queue_size){
printf("Thread is waiting .... \n");
pthread_cond_wait(&pool->ready, &pool->lock);
} pool->cur_queue_size--;
TaskNode *worker = pool->task_head;
pool->task_head= worker->next; pthread_mutex_unlock (&(pool->lock)); /* 调用函数,执行任务 */
worker->func(worker->work_id); free (worker);
worker = NULL;
}
} static void system_init ()
{
int i = 0; pool = (PthreadPool*) malloc(sizeof(PthreadPool)); /* 初始化锁与条件变量 */
pthread_mutex_init (&pool->lock, NULL);
pthread_cond_init (&pool->ready, NULL); /* 在池中加入 3 个线程 */
pool->thread_id = (pthread_t*) malloc(3 * sizeof(PthreadPool));
pool->cur_queue_size = 0;
pool->task_head= NULL; for(; i<3; i++)
pthread_create(&pool->thread_id[i], NULL, thread_routine, NULL);
} /* 添加任务 */
int pool_add_work (void (*process)(void *arg), unsigned int *id)
{
TaskNode *new_work = (TaskNode*) malloc(sizeof(TaskNode)); new_work->func = process;
new_work->work_id = id;
new_work->next = NULL; pool->cur_queue_size++; TaskNode *temp = pool->task_head; if(!temp)
pool->task_head = new_work;
else{
while(temp->next)
temp = temp->next;
temp->next = new_work;
} pthread_cond_signal(&pool->ready);
} /* 定义用户任务 */
void my_process(void *arg)
{
printf ("threadid is 0x%x, working on task %d \n", pthread_self(), *(int *)arg);
sleep (1);
} int main()
{
unsigned int work_id[10];
int i = 0; system_init(); /* 等待线程运行 */
sleep(1); for(; i<10; i++){
work_id[i] = i;
pool_add_work(my_process, &work_id[i]);
} /* 等待任务执行完毕 */
sleep(5); return 0;
}

Linux 上编译后,运行结果:

参考自:blog.csdn.net/zouxinfox/article/details/3560891

Linux C 实现一个简单的线程池的更多相关文章

  1. linux网络编程-一个简单的线程池(41)

    有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池 1.线程池拥有若干个线程,是线程的集合,线程池中的线程数目有严格的要求,用于执行大量的相对短 ...

  2. Linux C 一个简单的线程池程序设计

    最近在学习linux下的编程,刚开始接触感觉有点复杂,今天把线程里比较重要的线程池程序重新理解梳理一下. 实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任 ...

  3. linux网络编程之简单的线程池实现

    转眼间离15年的春节越来越近了,还有两周的工作时间貌似心已经不在异乡了,期待与家人团聚的日子,当然最后两周也得坚持站好最后一班岗,另外期待的日子往往是心里不能平静的,越是想着过年,反而日子过得越慢,于 ...

  4. Java一个简单的线程池实现

    线程池代码 import java.util.List; import java.util.Vector; public class ThreadPool  {     private static  ...

  5. 【C/C++开发】C++实现简单的线程池

    C++实现简单的线程池 线程池编程简介: 在我们的服务端的程序中运用了大量关于池的概念,线程池.连接池.内存池.对象池等等.使用池的概念后可以高效利用服务器端的资源,比如没有大量的线程在系统中进行上下 ...

  6. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  7. Java网络与多线程系列之1:实现一个简单的对象池

    前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...

  8. 简单C++线程池

    简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池.想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的.网上找到的 demo,基本都是介绍的 ...

  9. ExecutorService 建立一个多线程的线程池的步骤

    ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...

随机推荐

  1. shell搭建CentOS_7基础环境

    #!/bin/bash#Auth:Darius#CentOS_7配置实验环境eno=`ifconfig|awk '{print $1}'|head -1|awk -F ":" '{ ...

  2. 移动端布局:视口viewport的理解

    移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...

  3. MVC+EF 多条件查询

    根据以前的做法是拼接sql语句,这会增加维护成本,因为sql语句里的内容不会报错,所以在使用ef的时候必须要抛弃拼接sql语句的习惯. 构建实例 List<vyw_user> list = ...

  4. Django积木块九——富文本编辑器

    富文本编辑器 前端和后端都可以用富文本编辑器 # pip install django-tinymce # setting 'tinymce' TINYMCE_DEFAULT_CONFIG = { ' ...

  5. SolrCloud的搭建与稳定性测试

    转载请注明出处:http://www.cnblogs.com/wubdut/p/7573738.html 一.集群搭建 1. zookeeper搭建(版本:3.4) 1.1 zoo.cfg配置文件: ...

  6. JavaScript复习笔记——数据类型

    1.undefined 使用var声明但未对其进行初始化时,这个变量的值就是undefined. 对未被初始化的值使用typeof会返回undefined值,而对未声明的变量执行typeof操作同样也 ...

  7. PyCharm连接远程服务器

    PyCharm连接远程服务器 1.Tools->Start SSH session 2.新建一个连接或者选择一个已经存在的sftp 3.选择Edit credentials 填写相关连接信息 4 ...

  8. pyqt5安装问题

    最近装了下pyqt5,遇到了很多坑,要么是模块没找到,要么是各种ddl出错什么的 后来查了一下,总结一下: 1.pyqt5和python的版本一定匹配,尤其是自己去网上下的pyqt一定要注意适配的版本 ...

  9. Python 基础整理(未完)

    数据类型和变量: 整数:Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用十六 ...

  10. Ftp主动模式和被动模式以及java连接ftp模式设置

    Ftp主动模式和被动模式以及java连接ftp模式设置 https://www.cnblogs.com/huhaoshida/p/5412615.html (1) PORT(主动模式) PORT中文称 ...