`
shaojiashuai123456
  • 浏览: 262208 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

线程池 -- 链表

阅读更多

(1)constant.h文件

用来存放全局的宏定义和方法

 

#ifndef CONSTANT_H
#define CONSTANT_H

#include <malloc.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

typedef   enum status_t status_t;
enum status_t
{
	FAILED=0,
       SUCCESS=1, 
	NOT_FOUND=2,
};

typedef unsigned char u_int8_t;
typedef unsigned short u_int16_t;
typedef unsigned int u_int32_t;

#define malloc_thing(thing) (thing *)malloc(sizeof(thing))

//create bool
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#else
# ifndef HAVE__BOOL
#  define _Bool signed char
# endif /* HAVE__BOOL */
# define bool _Bool
# define false 0
# define true 1
# define __bool_true_false_are_defined 1
#endif /* HAVE_STDBOOL_H */
#ifndef FALSE
# define FALSE false
#endif /* FALSE */
#ifndef TRUE
# define TRUE  true
#endif /* TRUE */

#define max(x,y) ({ \
	typeof(x) _x = (x); \
	typeof(y) _y = (y); \
	_x > _y ? _x : _y; })


#define min(x,y) ({ \
	typeof(x) _x = (x); \
	typeof(y) _y = (y); \
	_x < _y ? _x : _y; })

#endif

 

(2)linked_list.h文件

链表的对外接口定义

 

#ifndef LINKED_LIST_H
#define LINKED_LIST_H

#include "constant.h"

typedef status_t (*linked_list_match_t)(void *item, ...);
typedef struct linked_list_t  linked_list_t;
struct linked_list_t
{
	void (*insert_first)(linked_list_t *this,void *item); //在首部插入
	void (*insert_last)(linked_list_t *this,void *item); //在尾部插入

                void *  (*find_first)(linked_list_t *this);                  //返回首部元素
	void * (*find_last)(linked_list_t *this);                    //返回尾部元素
	void * (*find_at)(linked_list_t *this,linked_list_match_t match,void *item,...);
                                                                                                //查找接口
                status_t  (*remove_first)(linked_list_t *this,void **item);  //删除第一元素
	status_t  (*remove_last)(linked_list_t *this,void **item);  //删除最后一个元素
	status_t (*remove_at)(linked_list_t *this,linked_list_match_t match,void **item,...);

               u_int32_t  (*get_count)(linked_list_t *this);           //元素个数
               void (*destroy)(linked_list_t *this);                         //销毁链表
};
//创建链表对象
linked_list_t * linked_list_create();
#endif

 

(2)linked_list.h文件

链表的具体实现

#include "linked_list.h"
#include <stdio.h>

#define DUG_LINKED_LIST  0
//链表中的节点
typedef struct element_t element_t;
struct element_t
{
	element_t *next;
	element_t *pre;
	void *data;
};

element_t * element_create(void *data)
{
	element_t *e=malloc_thing(element_t);
	e->next=NULL;
	e->pre=NULL;
	e->data=data;
	return e;
}

void element_destroy(element_t *e)
{
    free(e);
}
//私有链表的结构
typedef struct private_linked_list_t private_linked_list_t;
struct private_linked_list_t
{
                  linked_list_t public; //对外接口
	  element_t *first;     //首元素
	  element_t *last;     //尾元素
                  u_int32_t count;     //元素个数
};

static element_t* remove_element(private_linked_list_t *this,element_t *e)
{
	element_t *next, *previous;

	next = e->next;
	previous = e->pre;
	free(e);
	if (next)
	{
		next->pre = previous;
	}
	else
	{
		this->last = previous;
	}
	if (previous)
	{
		previous->next = next;
	}
	else
	{
		this->first = next;
	}
	if (--this->count == 0)
	{
		this->first = NULL;
		this->last = NULL;
	}
	return next;
}



static void insert_first(private_linked_list_t *this,void *item)
{
         element_t *e=element_create(item);
         if(this->count==0)
         {
		   this->first=e;
		   this->last=e;
         }
	  else
	  {
	         element_t *old=this->first;
	         e->next=old;
	         old->pre=e;
		  this->first=e;
	  }
	  this->count++;
}
static void insert_last(private_linked_list_t *this,void *item)
{
         element_t *e=element_create(item);
         if(this->count==0)
         {
		   this->first=e;
		   this->last=e;
         }
	  else
	  {
	         element_t *old=this->last;
	         e->pre=old;
	         old->next=e;
		  this->last=e;
	  }
	  this->count++;
}

static void * find_first(private_linked_list_t *this)
{
       if(this->count==0)
       {
               return NULL;
       }
	 else
	 {
	        return this->first->data;
	 }
}
static void * find_last(private_linked_list_t *this)
{
        if(this->count==0)
       {
               return NULL;
       }
	 else
	 {
	        return this->last->data;
	 }
}

static void * find_at(private_linked_list_t *this,linked_list_match_t match,void *item,void *p1,void *p2,void *p3)
{
       element_t *e=this->first;
       while(e)
       {
               if((match&&match(e->data,p1,p2,p3))||(!match&&e->data==item))
               {
                       return e->data;
               }
	        e=e->next;
       }
       return NULL;
}



static  status_t  remove_first(private_linked_list_t *this,void **item)
{
        if(this->count==0)
        {
                *item=NULL;
                return NOT_FOUND;
        }
	 else
	 {
		 
	       *item=this->first->data;
	 	remove_element(this, this->first);
		return SUCCESS;
	 }
	 
}
 static status_t remove_last(private_linked_list_t *this,void **item)
{
         if(this->count==0)
        {
                *item=NULL;
                return NOT_FOUND;
        }
	 else
	 { 
	       *item=this->last->data;
	 	remove_element(this, this->last);
		return SUCCESS;
	 }
}
 static status_t remove_at(private_linked_list_t *this,linked_list_match_t match,void **item,void *p1,void *p2,void *p3)
{
       element_t *e=this->first;
	 *item=NULL;
       while(e)
       {
               if((match&&match(e->data,p1,p2,p3))||(!match&&e->data== *item))
               {
                       #if  DUG_LINKED_LIST == 1
				    printf("linked_list_t => revove_at : find the element");
			  #endif
                       *item=e->data;
                       remove_element(this, e);
                       return SUCCESS;
               }
	        e=e->next;
       }
	#if  DUG_LINKED_LIST == 1
		printf("linked_list_t => revove_at : not  find the element");
	#endif
       return NOT_FOUND;
}

u_int32_t get_count(private_linked_list_t *this)
{
          return this->count;
}
void destroy(private_linked_list_t *this)
{
          void *item;
	  #if  DUG_LINKED_LIST == 1
			printf("linked_list_t => destroy\n");
	  #endif

	   while(remove_last(this, &item)==SUCCESS);
	   
	   free(this);
}

linked_list_t * linked_list_create()
{
	private_linked_list_t *this=malloc_thing(private_linked_list_t);
	this->public.insert_first=(void (*)(linked_list_t *,void *))insert_first;
	this->public.insert_last=(void (*)(linked_list_t *,void *))insert_last;

                this->public.find_first=(void * (*)(linked_list_t *))find_first;
	this->public.find_last=(void * (*)(linked_list_t *))find_last;
	this->public.find_at=(void * (*)(linked_list_t *,linked_list_match_t,void *,...))find_at;

                this->public.remove_first=( status_t  (*)(linked_list_t *,void **))remove_first;
	this->public.remove_last=( status_t  (*)(linked_list_t *,void **))remove_last;
	this->public.remove_at=( status_t  (*)(linked_list_t *,linked_list_match_t,void **,...))remove_at;

                this->public.get_count=(u_int32_t (*)(linked_list_t *))get_count;
                this->public.destroy=(void (*)(linked_list_t *))destroy;
                this->count=0;
	this->first=NULL;
	this->last=NULL;
	return &this->public;
}

 

  • ss.rar (8.7 KB)
  • 下载次数: 2
分享到:
评论

相关推荐

    JAVA并发编程实践-线程池-学习笔记

    - **阻塞队列类别**:常见的阻塞队列有ArrayBlockingQueue(定长数组)、LinkedBlockingQueue(链表结构)、SynchronousQueue(不存储元素的队列)等,它们有不同的性能特性。 - **饱和策略**:当线程池和队列都...

    VC 建立线程池的源码实例.rar

    这通常是一个队列数据结构,例如链表或数组,用于存放任务的描述或回调函数。 3. **线程管理**:线程池需要管理线程的生命周期,包括创建、启动、等待和销毁线程。线程的数量应根据系统资源和任务量动态调整。在...

    linux线程池创建c实现

    pool_destroy() 函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。 线程池结构体 CThread_pool 中的成员变量包括: * pthread_mutex_t queue_lock:用于...

    linux 实现一个简单的线程池及工作

    - **标准C库**:如`queue.h`(链表)或自定义数据结构实现任务队列。 5. **线程池工作流程** - **创建线程池**:根据需求初始化线程池,创建指定数量的工作线程。 - **提交任务**:将任务添加到任务队列中。 - ...

    线程池java写的代码

    - `LinkedBlockingQueue`: 无界阻塞队列,基于链表结构,线程安全。 - `PriorityBlockingQueue`: 优先级队列,线程安全,根据任务的优先级排序。 - `SynchronousQueue`: 同步队列,不存储任务,任务间直接传递,线程...

    Java版线程池实现

    - `m_ReserveList`:保留线程链表,存储未分配任务的备用线程。 - `m_RunList`:工作任务列表,采用`LinkedList`实现,用于存放待执行的任务。 3. **状态变量**: - `freeThreadCount`:未被使用的线程数目,...

    linux线程池C源码

    - **任务队列**:使用队列数据结构(如链表或数组)存储待处理的任务。 - **任务调度**:线程池管理者负责从任务队列中取出任务,分配给空闲线程。 - **信号量管理**:使用信号量同步线程池中的线程,确保线程...

    易语言真正的线程池简易实现

    4.链表,队列——易语言数据结构支持库的使用:见易语言帮助文档。5.多线程间的许可证的使用:见易语言帮助文档。6.原子锁操作:http://baike.baidu.com/view/6235756.htm。一.了解线程池的运行原理:。线程池是一...

    LINUX_c++线程池

    4. **任务队列**:用于存储待处理任务的数据结构,通常是一个队列或链表。 5. **同步机制**:包括互斥锁`CThreadMutex`和条件变量`CCondition`等,用于保证线程安全和协调线程间的执行顺序。 #### 四、线程池框架...

    VC6.0线程池,参考别人代码实现

    - 任务队列的实现,可能是一个双向链表或数组。 - 线程对象的定义,可能包含线程函数入口和数据传递结构体。 - 同步原语的使用,如`CRITICAL_SECTION`或`mutex`来保护共享资源。 - 示例代码展示如何创建线程池实例,...

    LInux c++ 线程池封转框架

    4. **任务队列**:用于存储待处理任务的数据结构,可以是队列或链表。 5. **线程同步组件**:包括CThreadMutex(互斥锁)和CCondition(条件变量),确保线程安全地访问和管理任务队列。 线程池的工作流程如下: ...

    面试必备:Java线程池解析.pdf

    在Java中,线程池是一种实现池化技术的方式,主要是为了减少频繁创建和销毁线程所消耗的资源。线程池管理着多个线程,它们可以在一个队列中等待处理任务,从而提高系统响应速度,并实现资源的重复利用。在求职面试...

    线程池原理及创建

    - **任务队列**:存储待执行任务的数据结构,可以是队列、链表等。 - **线程同步机制**:如互斥锁(Mutex)和条件变量(Condition),确保线程安全地访问共享资源。 在C++实现中,可以设计如下类结构: - `...

    threadpool 线程池 C语言版

    4. **任务队列**:可以采用链表或数组实现,用于存放待执行的任务。 5. **线程创建和销毁函数**:用于初始化线程池,创建线程,并在不再需要时销毁线程。 6. **任务添加函数**:将新任务放入任务队列。 7. **线程主...

    线程池的源代码

    //线程池链表属性 typedef struct threadpool{ int shutdown; /*线程池销毁标记*/ int max_thr_num; /*最大线程数*/ pthread_t *thr_id; //线程id数组 tpool_work_st *queue_head; //线程池队列头...

    线程池原理及创建(C++实现

    * 任务队列:线程池的概念具体到实现则可能是队列,链表之类的数据结构,其中保存执行线程。 线程池框架的实现 我们实现的通用线程池框架由五个重要部分组成:CThreadManage,CThreadPool,CThread,CJob,...

    C线程池简单应用层实现

    本文将深入探讨如何在C语言中实现一个简单的线程池应用层,并关注其中的关键技术,如双向循环链表、带参宏、管道通信以及二级指针的使用。 首先,线程池的概念基于预先创建一组线程,它们在需要时执行任务,而不是...

    最全的线程池的资料,里面包含了各种图片简单易懂

    - **LinkedBlockingQueue**:基于链表的阻塞队列,适用于需要较大容量或未知容量的场景。 - **SynchronousQueue**:无界队列,但不存储任何元素,仅作为线程间传递数据的媒介,适用于需要快速响应且任务能立即执行的...

Global site tag (gtag.js) - Google Analytics