一个简单线程池的实现---需进一步完善

1.定义一个任务结构体,和一个线程池结构体

struct task{
 void *(*p)(void*);//需要实现的函数;
 void *arg;//函数所带的参数
 struct task *next;
};
struct pthread_pool{
 pthread_mutex_t mutex;//线程锁
 pthread_cond_t cond;//条件变量
 pthread_t *tids;//线程id
 int thread_nums;//需创建的线程的数量
 struct task *head;任务头结点
 int cur_queue_size;//标记为控制条件变量的阻塞wait
};

2.添加任务----》初始化任务链表,添加节点

pool_add_task(void*(*pro)(void *),void *arg)
{
 struct task *new = malloc(sizeof(struct task));//初始化任务结构体
 new->p = pro;
 new->arg = arg;
 new->next = NULL;
 pthread_mutex_lock(&(pool->mutex));//对公共资源操作时,记住时常上锁,解锁
 struct task *lastnode = pool->head;
 if(lastnode == NULL)//两种情况,判断头结点是否为空
 {
  pool->head = new;
 }

//?????前面几句如果改成lastnode = new;出现段错误。无解
 else
 {
  while(lastnode->next!=NULL)//头结点不为空的情况
  {
   lastnode = lastnode->next;
  }
  lastnode->next = new;
 }
 pool->cur_queue_size++;//每添加一个结点,标记位+1
// printf("%d\n",*(int *)(new->arg));
// printf("%d\n",pool->cur_queue_size);
 pthread_mutex_unlock(&(pool->mutex));
 pthread_cond_signal(&pool->cond);//向处于阻塞状态的线程发送唤醒信号
}

3.线程初始化----》创建线程(功能函数)

void pool_init(int thread_num)
{

//对线程池结构体初始化
 pool = malloc(sizeof(struct pthread_pool));
 pthread_mutex_init(&(pool->mutex),NULL);
 pthread_cond_init(&(pool->cond),NULL);
 pool->thread_nums = thread_num;
 pool->head = NULL;
 pool->cur_queue_size = 0;
 pool->tids = malloc(thread_num*sizeof(pthread_t));
 int i = 0;
 for(i=0;i<thread_num;i++)
 {
  pthread_create(&(pool->tids[i]),NULL,thread_r,NULL);
//  printf("pool init\n");
 }
}

4.任务函数(从任务链表的头部扣下结点,执行结构体中的函数)

void* thread_r(void*p)
{
 while(1)
 { 
 
  pthread_mutex_lock(&(pool->mutex));
  while(pool->cur_queue_size == 0)
 // printf("wait\n"); //ok
  pthread_cond_wait(&(pool->cond),&(pool->mutex));
 
 // printf("wait!\n");
  struct task *q = pool->head;
//   printf("q jiedian\n");
   pool->head = q->next;
  // printf("pool->next\n");
   q->next = NULL;
  // printf("put in error\n");
   pool->cur_queue_size--;
  pthread_mutex_unlock(&pool->mutex);
 // printf("pthred_r\n");
  (*(q->p))(q->arg);//执行结构体中的函数
  free(q);
  q = NULL;
// if(pool->cur_queue_size ==0)
//  break;
 }
}

5.功能函数中的函数指针。

void *f1(void *arg)

{

int a = *(int*)arg;

// sleep(1);

printf("%d\n",a);

}

main函数:(如何销毁线程池,需待解)

int main()
{
 pool_init(3);
// printf("pthread pool is start\n");
// sleep(1);
 int a=12;
 pool_add_task(f1,(void*)&a);
// sleep(2);
// printf("pool_add_task\n");
 pool_add_task(f1,(void*)&a);
 pool_add_task(f1,(void*)&a);
// sleep(5);
 pthread_join(pool->tids[0],NULL);
 pthread_join(pool->tids[1],NULL);
 pthread_join(pool->tids[2],NULL);

}

时间: 2025-01-06 18:49:53

一个简单线程池的实现---需进一步完善的相关文章

自己实现一个简单线程池

先上原理图: 上代码之前,要先补充一下线程池构造的核心几个点 线程池里的核心线程数与最大线程数 线程池里真正工作的线程worker 线程池里用来存取任务的队列BlockingQueue 线程中的任务task 本例实现简化了一些,只实现了BlockingQueue存放任务,然后每个worker取任务并执行,下面看代码首先定义一个线程池ThreadExcutor class ThreadExcutor{ //创建 private volatile boolean RUNNING = true; //

一个简单线程池例子

// Test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <process.h> #include <vector> typedef unsigned (__stdcall*LP_THREAD_FUN)(void*); class Thread{ public: Thread(){ m_fun = NULL; m_param = NULL; m_

Linux多线程实践(9) --简单线程池的设计与实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

Linux下简单线程池的实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

简单线程池的实现

1. 什么是线程池 线程池是线程的集合,拥有若干个线程,线程池中的线程一般用于执行大量的且相对短暂的任务.如果一个任务执行的时间很长,那么就不适合放在线程池中处理,比如说一个任务的执行时间跟进程的生命周期是一致的,那么这个线程的处理就没有必要放到线程池中调度,用一个普通线程即可. 线程池中线程的个数太少的话会降低系统的并发量,太多的话又会增加系统的开销.一般而言,线程池中线程的个数与线程的类型有关系,线程的类型分为 1.     计算密集型任务: 2.     I/O密集型任务. 计算密集型任务

LINUX下的简单线程池

前言 任何一种设计方式的引入都会带来额外的开支,是否使用,取决于能带来多大的好处和能带来多大的坏处,好处与坏处包括程序的性能.代码的可读性.代码的可维护性.程序的开发效率等. 线程池适用场合:任务比较多,需要拉起大量线程来处理:任务的处理时间相对比较短,按照线程的周期T1(创建阶段).T2(执行阶段).T3(销毁阶段)来算,执行阶段仅占用较少时间. 简单的线程池通常有以下功能:预创建一定数量的线程:管理线程任务,当工作线程没有事情可做时休眠自己:销毁线程池. 复杂一些的线程池有额外的调节功能:管

C++版简单线程池

需求 之前写过一个C#版本的简单线程池http://blog.csdn.net/ylbs110/article/details/51224979 由于刚刚学习了C++11新特性中的future,于是想到用它来实现一个线程池. 实现 思路基本和C#版本的一样,主要区别是委托的实现,线程句柄的不同和线程锁: 本来C++有function模板,但是实现起来比较麻烦,这里主要是实现线程池,所以动态参数的委托就不实现了,直接使用typedef void(*Func)();来实现一个无参数无返回值的函数指针

发一个可伸缩线程池大小的python线程池。已通过测试。

发一个可伸缩线程池大小的线程池. 当任务不多时候,不开那么多线程,当任务多的时候开更多线程.当长时间没任务时候,将线程数量减小到一定数量. """ 可自动实时调节线程数量的线程池. """ import atexit import queue import sys import threading import time import weakref from app.utils_ydf import LoggerMixin, nb_print,

自实现简单线程池

线程池在现在的系统和框架中十分常见.明白线程池的思想原理,不仅对学习线程只是有很大的帮助.对理解一些系统的线程池实现也有很大的帮助.下面是我自己简单实现的一个线程池.用以对线程的简单理解. 线程的实现原理很简单: 线程池对象包含以下组件:工作者队列,Job队列: 用户通过线程池对象添加删除工作者,线程池对象维持工作者对象这个池和工作者的实际工作: 工作者池中的线程在用户没用明确关闭前不断的从Job队列拿取job执行job. 好了,一切看代码: 1.以接口编程,首先创建ThreadPool接口: