C++ 线程池的设计问题

1. 给用户添加任务的接口是 schedule(arg), arg应该如何设置


a) 创建 Work class, 将arg设置为 Work*, Work由用户创建,用户删除,线程池内仅保留对Work对象的引用

问题:我写完thread_pool后才发现,用户不再知道如何去删除他创建的
Work了,因为线程池内保存着指向Work的指针,线程池是自动析构的,因此,这种设计方法不可行

b) 设计方法和 a 一致,唯一的不同是线程池内复制了Work, 在类内,直接使用Work对象,不再使用指针了

问题:对于每一个局部变量都需要创建一个Work对象,假如用户数足够多的话,这是很耗时的。我写过的程序告诉我,尽量少的使用局部变量

c) 让用户创建 shared_ptr 类型的Work

问题:对于client来讲,太复杂了

最终方案:

schedule设置三个接口,一个接口符合Posix的线程调用习惯,直接使用 schedule(void(*func)(void*),
(void*))。另一个接口使用 schedule(Work*), 最后一个接口schedule(Work)

线程池内部使用shared_ptr包含Work。

2. shutdown() 和shutdownNow()的设计


shutdown() 指示线程池不再接受新的任务

shutdownNow() 指示线程池唤醒所有的等待线程并对所有的线程执行 interrupt() 函数

3. 线程池析构函数的使用


线程池的析构函数和shutdown()类似,唤醒等待的线程(线程只有在工作队列为空的情况下才会去等待),并等待所有running的进程结束。析构函数不需要析构数据结构,因为数据结构都设置为
shared_ptr的。

4. 工作线程的启动方式


boost::thread
的启动函数只能在线程初始化时赋予,中途不得更改(没有这种接口),因此,线程池在初始化时让所有的工作线程进行无限循环等待任务,在循环体内接受shutdown()
或 shutdownNow() 任务

C++ 线程池的设计问题,布布扣,bubuko.com

时间: 2024-10-05 19:34:54

C++ 线程池的设计问题的相关文章

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

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

两种unix网络编程线程池的设计方法

unp27章节中的27.12中,我们的子线程是通过操作共享任务缓冲区,得到task的,也就是通过线程间共享的clifd[]数组,这个数组其实就是我们的任务数组,得到其中的connfd资源. 我们对这个任务数组的操作,需要互斥量+条件变量达到同步的目的..每个线程是无规律的从clifd得到任务,然后执行的.任务和线程之间没有对应关系.线程完成本次任务之后,如果任务数组中任然有任务,则再次运行下一个任务. 而另外的一个线程池模型中,pthread_create (&temp[i].tid, NULL

http线程池的设计与实现(c++)

http线程池的主要用途是异步处理使用无状态短连接的http请求,在传输层通信基于tcp协议和应用层基于http协议的基础上,达到c++服务器与web服务器通信的目的. 设计上: (1)服务器启动时,初始化配置数量的线程(形成被动连接线程池).每个线程会生成epoll描述符. (2)主线程生成监听socket,绑定端口.生成epoll描述符,注册监听socket,非阻塞接收(限定最大时间,如2s)新连接到连接队列. (2)投放主线程连接队列中的新连接到被动连接线程池.根据硬哈希选择需求的线程来投

线程池的设计

http://blog.csdn.net/liangjingbo/article/details/2777112 目前线程池主要包含下列部分: 1.        busy_list 当前在处理客户请求的线程队列,即正在进行智能网页分析的线程 2.        idle_list 当前线程池中空闲的线程队列 3.        request_list 当用户请求到达后,发现线程池中已经没有可用线程,同时线程的个数已经达到了最大限制数(可设定的),此时只能将此次请求放入请求队列中,等待管理线程

线程池的设计思想

单例模式之懒汉式 饿汉式在多线程的情况小可能会出现多实例的情况 解决1:加锁 解决2:双层判断方式,减少枷锁的次数doubleCheck 3.保证程序的有序性,禁止程序内部优化,从而保证不会出现空指针异常 4.利用jvm只产生一份static,并且是主动加载,实现单例懒汉式 使用枚举模式 原文地址:https://www.cnblogs.com/zj-xu/p/11863527.html

使用线程池优化多线程编程

Java中的对象是使用new操作符创建的,如果创建大量短生命周期的对象,这种方式性能非常低下.为了解决这个问题,而发明了池技术. 对于数据库连接有连接池,对于线程则有线程池. 本实例介绍两种方式创建1000个短生命周期的线程,第一种是普通方式,第二种是线程池的方式.通过时间和内存消耗的对比,就可以很明显地看出线程池的优势. 实例结果如下: 说明:使用线程池创建对象的时间是15毫秒,说明线程池是非常高效的. 关键技术: Executors类为java.util.concurrent包中所定义的Ex

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

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

线程池的原理和实现

一. 线程池的简介 通常我们使用多线程的方式是,需要时创建一个新的线程,在这个线程里执行特定的任务,然后在任务完成后退出.这在一般的应用里已经能够满足我们应用的需求,毕竟我们并不是什么时候都需要创建大量的线程,并在它们执行一个简单的任务后销毁. 但是在一些web.email.database等应用里,比如彩铃,我们的应用在任何时候都要准备应对数目巨大的连接请求,同时,这些请求所要完成的任务却又可能非常的简单,即只占用很少的处理时间.这时,我们的应用有可能处于不停的创建线程并销毁线程的状态.虽说比

python(13)线程池:threading

先上代码: 1 pool = threadpool.ThreadPool(10) #建立线程池,控制线程数量为10 2 reqs = threadpool.makeRequests(get_title, data, print_result) #构建请求,get_title为要运行的函数,data为要多线程执行函数的参数 3 #最后这个print_result是可选的,是对前两个函数运行结果的操作 4 [pool.putRequest(req) for req in reqs] #多线程一块执行