iOS编程高性能之路-基于pthread的线程池

原文链接--http://blog.sina.com.cn/s/blog_7011f21c0101dkjj.html

在OC的框架中从NSOperation到GCD的dispatch queue到处都充斥着队列的概念,OC的框架帮我们把底层线程的调度都已经写好了,这样的好处是我们可以专心于上层的业务逻辑,坏处当然是我们对底层调度的掌控力变弱了。写这个线程池的原因也是练练手,至于效率如何,在发到线上几个版本后,反馈还可以。当然还有空间可以持续优化。

一.线程池流程

1.在程序启动时创建固定个线程,做为线程池,等待调度

2.当线程池获取到任务时 根据任务类型进行线程调度

3.任务执行

整个的流程很简单,下面我们需要创建一些必要的结构来支持我们的需求

typedef void (*tfmethod)(void *,short *);

typedef struct s_tftask_content{

tfmethod method;

void *arg;

short *cancel_point;

struct s_tftask_content *next;

}s_tftask_content;

typedef struct s_tfthread_config{

pthread_mutex_t mtx;

pthread_cond_t cond;

}s_tfthread_config;

typedef struct s_tftask{

s_tfthread_config config;

short thread_status;

s_tftask_content *task_list;

}s_tftask;

enum  tfthread_status{

tfthread_init=0x0,

tfthread_idle,

tfthread_inuse,

tfthread_dead

};

enum tftask_type{

tftask_net_req=0x0,

tftask_first_respond,

tftask_assign,

tftask_io_write

};

typedef struct s_tfthread{

s_tftask *tftask;

char *name;

}s_tfthread;

二.实现

1.循环通过pthread_create创建线程,创建s_tfthread对象做为线程句柄加入线程数组,s_tftask_content->methord初始化为空函数,同时创建任务执行函数,执行完task初始化函数后,在执行函数中通过pthread_cond_wait信号将当前创建的线程挂起。

s_tftask_content *content =  (s_tftask_content *)malloc(sizeof(s_tftask_content));

content->next= NULL;

content->method = empty_run;

content->cancel_point=NULL;

s_tftask *task = (s_tftask *)malloc(sizeof(s_tftask));

task->task_list = content;

task->thread_status = tfthread_idle;

s_tfthread_config config = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER};

task->config = config;

s_tfthread *thread = (s_tfthread *)malloc(sizeof(s_tfthread));

thread->tftask = task;

thread->name = k_tfthread_names[i];

k_threads[i]=thread;

ret  = pthread_create(&posix_t_id, &attr, tfthreadpool_task_run,task);

2.循环创建完毕之后,程序中将会有n个挂起状态的线程,当需要执行新的task的时候查找根据不同的task标志在k_threads中查询出空闲线程,并创建新的s_tftask_content加入s_tfthread的任务列表,通过pthread_cond_signal重新唤醒该线程继续执行任务。

时间: 2024-10-13 11:57:15

iOS编程高性能之路-基于pthread的线程池的相关文章

基于pthread的线程池实现

最近在做项目的过程中,需要使用线程池来实现任务的异步处理.即线程池中包含提前创建好的线程,客户将任务提交到线程池中,线程池中的线程对任务进行获取并执行.针对项目所使用的pthread线程库,我们设计与实现了一个简单的线程池. 在介绍线程池的实现之前,首先整理一下pthread库的一些接口.pthread是由POSIX提出的线程实现,广泛地被各种unix平台所支持.创建线程的接口为 pthread_create(pthread_t* thread, const pthread_attr_t* at

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

基于队列的线程池

import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /**  * Created 

Java并发编程实践读书笔记(5) 线程池的使用

Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到线程安全问题.如果你认为只会在单任务线程的Executor中运行的话,从设计上讲这就已经耦合了. 3,长时间的任务有可能会影响到其他任务的执行效率,可以让其他线程在等待的时候限定一下等待时间.不要无限制地等待下去. 确定线程池的大小 给出如下定义: 要使CPU达到期望的使用率,线程池的大小应设置为:

Python菜鸟之路:Python基础-线程池注释

import sys import threading import Queue import traceback # 定义一些Exception,用于自定义异常处理 class NoResultsPending(Exception): """All works requests have been processed""" pass class NoWorkersAvailable(Exception): """N

Java并发编程系列之二十五:线程池

线程池简介 在之前介绍Executor框架的文章中对线程池有一个初步的认识,实际上线程池这种设计思想在Java中很普遍,比如JVM中常量池,以及Web开发使用到的数据库连接池.这些池本质上还是Java中的对象池,因为池中存放的都是Java对象.回到线程池,几乎所有需要异步或者执行并发任务的程序都可以使用到线程池.使用线程池带来的好处主要包括以下几个方面: 一,提高资源利用率.由于线程池中的线程使可以重复利用的,所以达到了循环利用的目的 二,提高响应速度.由于线程的创建也是需要开销的,如果请求到来

基于C++11线程池

1.包装线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(false){} task( const task & ) = delete; ~task(){} task & operator =( const task &) = delete; void start(); void stop() { exit_ = true; sync_.noti

并发编程常用工具类(二) SymaPhore实现线程池

1.symaPhore简介 symaphore(信号量)用来控制同时访问某个资源的线程数量,一般用在并发流量控制.个人对它的理解相当于是接待室每次只能接待固定数量的人,当达到最高接待数的时候,其他人就会被拦截在外等待,当前面接待完走出接待室,才会继续接待下面的人. 2.symaphore使用 symaphore有两个构造方法:构造方法Semaphore(int permits)接受一个int参数,表示可用的许可证数量,内部默认创建一个非公平锁:构造方法Semaphore(int permits,

Java并发编程原理与实战三十七:线程池的原理与使用

一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExecutor实现的.好的,让我们来看看ThreadPollExcutor是怎样实现的呢? 如果你想了解ThreadPoolExecutor的话.可以先从它的构造方法看起. ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,