(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;
}
分享到:
相关推荐
- **阻塞队列类别**:常见的阻塞队列有ArrayBlockingQueue(定长数组)、LinkedBlockingQueue(链表结构)、SynchronousQueue(不存储元素的队列)等,它们有不同的性能特性。 - **饱和策略**:当线程池和队列都...
这通常是一个队列数据结构,例如链表或数组,用于存放任务的描述或回调函数。 3. **线程管理**:线程池需要管理线程的生命周期,包括创建、启动、等待和销毁线程。线程的数量应根据系统资源和任务量动态调整。在...
pool_destroy() 函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。 线程池结构体 CThread_pool 中的成员变量包括: * pthread_mutex_t queue_lock:用于...
- **标准C库**:如`queue.h`(链表)或自定义数据结构实现任务队列。 5. **线程池工作流程** - **创建线程池**:根据需求初始化线程池,创建指定数量的工作线程。 - **提交任务**:将任务添加到任务队列中。 - ...
- `LinkedBlockingQueue`: 无界阻塞队列,基于链表结构,线程安全。 - `PriorityBlockingQueue`: 优先级队列,线程安全,根据任务的优先级排序。 - `SynchronousQueue`: 同步队列,不存储任务,任务间直接传递,线程...
- `m_ReserveList`:保留线程链表,存储未分配任务的备用线程。 - `m_RunList`:工作任务列表,采用`LinkedList`实现,用于存放待执行的任务。 3. **状态变量**: - `freeThreadCount`:未被使用的线程数目,...
- **任务队列**:使用队列数据结构(如链表或数组)存储待处理的任务。 - **任务调度**:线程池管理者负责从任务队列中取出任务,分配给空闲线程。 - **信号量管理**:使用信号量同步线程池中的线程,确保线程...
4.链表,队列——易语言数据结构支持库的使用:见易语言帮助文档。5.多线程间的许可证的使用:见易语言帮助文档。6.原子锁操作:http://baike.baidu.com/view/6235756.htm。一.了解线程池的运行原理:。线程池是一...
4. **任务队列**:用于存储待处理任务的数据结构,通常是一个队列或链表。 5. **同步机制**:包括互斥锁`CThreadMutex`和条件变量`CCondition`等,用于保证线程安全和协调线程间的执行顺序。 #### 四、线程池框架...
- 任务队列的实现,可能是一个双向链表或数组。 - 线程对象的定义,可能包含线程函数入口和数据传递结构体。 - 同步原语的使用,如`CRITICAL_SECTION`或`mutex`来保护共享资源。 - 示例代码展示如何创建线程池实例,...
4. **任务队列**:用于存储待处理任务的数据结构,可以是队列或链表。 5. **线程同步组件**:包括CThreadMutex(互斥锁)和CCondition(条件变量),确保线程安全地访问和管理任务队列。 线程池的工作流程如下: ...
在Java中,线程池是一种实现池化技术的方式,主要是为了减少频繁创建和销毁线程所消耗的资源。线程池管理着多个线程,它们可以在一个队列中等待处理任务,从而提高系统响应速度,并实现资源的重复利用。在求职面试...
- **任务队列**:存储待执行任务的数据结构,可以是队列、链表等。 - **线程同步机制**:如互斥锁(Mutex)和条件变量(Condition),确保线程安全地访问共享资源。 在C++实现中,可以设计如下类结构: - `...
4. **任务队列**:可以采用链表或数组实现,用于存放待执行的任务。 5. **线程创建和销毁函数**:用于初始化线程池,创建线程,并在不再需要时销毁线程。 6. **任务添加函数**:将新任务放入任务队列。 7. **线程主...
//线程池链表属性 typedef struct threadpool{ int shutdown; /*线程池销毁标记*/ int max_thr_num; /*最大线程数*/ pthread_t *thr_id; //线程id数组 tpool_work_st *queue_head; //线程池队列头...
* 任务队列:线程池的概念具体到实现则可能是队列,链表之类的数据结构,其中保存执行线程。 线程池框架的实现 我们实现的通用线程池框架由五个重要部分组成:CThreadManage,CThreadPool,CThread,CJob,...
本文将深入探讨如何在C语言中实现一个简单的线程池应用层,并关注其中的关键技术,如双向循环链表、带参宏、管道通信以及二级指针的使用。 首先,线程池的概念基于预先创建一组线程,它们在需要时执行任务,而不是...
- **LinkedBlockingQueue**:基于链表的阻塞队列,适用于需要较大容量或未知容量的场景。 - **SynchronousQueue**:无界队列,但不存储任何元素,仅作为线程间传递数据的媒介,适用于需要快速响应且任务能立即执行的...