- 浏览: 987087 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
这是对 pthread线程的一个简单应用
1. 实现了线程池的概念,线程可以重复使用。
2. 对信号量,互斥锁等进行封装,业务处理函数中只需写和业务相关的代码。
3. 移植性好。如果想把这个线程池代码应用到自己的实现中去,只要写自己的业务处理函数和改写工作队列数据的处理方法就可以了。
Sample代码主要包括一个主程序和两个线程实现类
ThreadTest.cpp:主程序
CThreadManager:线程管理 Class,线程池的实现类
CThread:线程 Class.
主程序实现方法。
1. 实现 main函数和一个需要线程处理的业务函数(例子代码中业务函数是一个简单的计算函数 Count)。在 main函数中创建 CThreadManager的实例,产生线程池。这个时候,把业务函数作为函数指针传到 CThreadManager里面,最终会被线程调用。
2. 向工作队列中放入业务函数要处理的数据。
3. 设置信号量,唤醒线程。
2 int Count( int nWork)
3 {
4 int nResult = nWork * nWork;
5 printf( " count result is %d\n " ,nResult);
6
7 return 0 ;
8 }
9
10 int main() {
11
12 // 创建线程管理类的实例,把要执行的线程函数和最大线程数传进去
13 CThreadManager * pManager = new CThreadManager(Count, 3 );
14
15 // 把要进行计算的数放到工作队列中
16 pManager -> PushWorkQue( 5 );
17 pManager -> PushWorkQue( 20 );
18
19 // 设置信号量,唤醒线程
20 pManager -> PostSem();
21 pManager -> PostSem();
22
23 // 等待子线程执行
24 sleep( 1 );
25
26 return 0 ;
27 }
CThreadManager实现的方法
1. 把信号量和互斥锁等封装成自己的函数
2. 在 new方法里,循环调用 CThread的 new方法,启动一定数量(可设定)的线程,产生线程池。
3. 这些线程启动后,就会执行 CThreadManager中的 ManageFuction函数。这个函数是无限循环的,保证了线程在整个程序的生命周期中不销毁。
4. 在循环处理里面,第一行代码就是等待一个信号量,这个信号量是由主程序进行设置的,这个信号信号量如果没有被设置(代表暂时没有需要处理的工作),所有线程都在这里阻塞着。
4. 一旦信号量被设置,根据 Linux线程调度机制,在阻塞的线程队列中,其中一个线程被唤醒,可以执行后面的代码。
5. 从工作队列中取出要进行处理的数据(使用互斥锁进行排他)
6. 通过函数指针调用 main函数传过来的业务函数,处理数据。
7. 业务函数执行完之后,线程进入下一个循环,等待新的信号量。
friend void * ManageFuction( void * );
private :
sem_t m_sem; // 信号量
pthread_mutex_t m_mutex; // 互斥锁
queue < int > m_queWork; // 工作队列
list < CThread *> m_lstThread; // 线程list
int ( * m_threadFuction)( int ); // 函数指针,指向main函数传过来的线程执行函数
public :
CThreadManager( int ( * threadFuction)( int ), int nMaxThreadCnt);
virtual ~ CThreadManager();
int WaitSem();
int PostSem();
int LockMutex();
int UnlockMutex();
void PushWorkQue( int nWork);
int PopWorkQue();
int RunThreadFunction( int nWork);
};
// 线程执行函数,它只是个壳子,处理信号量和互斥锁等,
// 最后调用main函数传过来的线程执行函数来实现业务处理
void * ManageFuction( void * argv)
{
CThreadManager * pManager = (CThreadManager * )argv;
// 进行无限循环(意味着线程是不销毁的,重复利用)
while ( true )
{
// 线程开启后,就在这里阻塞着,直到main函数设置了信号量
pManager -> WaitSem();
printf( " thread wakeup.\n " );
// 从工作队列中取出要处理的数
pManager -> LockMutex();
int nWork = pManager -> PopWorkQue();
pManager -> UnlockMutex();
printf( " call Count function.\n " );
pManager -> RunThreadFunction(nWork);
}
return 0 ;
}
CThreadManager::CThreadManager( int ( * threadFuction)( int ), int nMaxThreadCnt)
sem_init( & m_sem, 0 , 0 );
pthread_mutex_init( & m_mutex, NULL);
m_threadFuction = threadFuction;
for ( int i = 0 ; i < nMaxThreadCnt; i ++ )
{
CThread * pThread = new CThread(ManageFuction, this );
printf( " thread started.\n " );
m_lstThread.push_back(pThread);
}
}
CThread实现的方法
CThreadManager比较简单,封装了创建线程和 join线程的函数。
// 初始化线程属性
pthread_attr_t threadAttr;
pthread_attr_init( & threadAttr);
pthread_create( & m_thread, & threadAttr, threadFuction, threadArgv);
}
程序的执行结果如下
sample代码可以从这里 下载。
代码在windows的eclipse cdt + cygwin 平台上开发, 在Linux平台上测试通过。
发表评论
-
NotePad++ - 安装和配置C/C++开发插件
2011-11-15 23:00 1772NotePad++ - 安装和配置C/C+ ... -
VC中使用ATL编写控件 【转】
2011-10-21 15:23 2110VC中使用ATL编写控件 作者:邵盛松 2010 ... -
在Windows环境下MongoDB搭建和简单操作【转】
2011-10-21 12:37 944一,安装mongoDB 1,解 ... -
Mongodb在Windows下安装及配置【转】
2011-10-21 12:35 5531.下载mongodb的windows版本,有32位和64位版 ... -
一篇介绍VC开发OCX的文章[转]
2011-10-20 17:57 1839转自“http://www.cnblogs.com/genga ... -
使你的ActiveX控件执行时不弹出安全性提示 (转载)
2011-10-20 17:56 1170使你的ActiveX控件执行时不弹出安全性提示 2010-0 ... -
VC++ 的MFC 和ATL 及COM 是什么?
2011-10-20 01:12 993一、什么是MFC 微软基础类(Micro ... -
使用ATL编写一个简单的COM服务器【转】
2011-10-20 01:10 867下载例子代码 本文的对象是COM编程 ... -
使用VC++6.0制作ASP服务器控件简介[转]
2011-10-20 01:10 673用ASP写网页的程序 员,一定对VBSript语句“Set ... -
基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql
2011-09-01 13:49 1529基于CentOS 5.4搭建nginx+php+sp ... -
解决mrtg的Use of uninitialized value in hash element at /usr/bin/indexmaker line 35
2011-09-01 13:41 2311mrtg的安装过程这里就不再阐述,随便搜索一下。使用ind ... -
用MRTG检测Linux网络性能
2011-09-01 10:49 874随着Linux应用的日益广泛,有大量的网络服务器使用Linux ... -
Linux安装配置maven3.0以及搭建nexus私服
2011-08-30 23:45 1631一、软件准备 1、apache-maven-3.0-b ... -
GraphicsMagick介绍及安装
2011-08-30 23:16 1538作者:Cocowool 来源:博客园 发布时 ... -
Makefile
2011-08-30 22:10 872CC = g++ CFLAG = -Wall -g -w ... -
高位字节优先 低位字节优先
2011-08-24 17:30 1169自第一台计算机诞生, ... -
C++方式的文件操作
2011-08-24 16:05 1821本文主要讨论C++标准I/O库,主要内容为控制台输入输出流 ... -
【JAVA实用工具】JNA-通过它调用C++的方法,比JNI方便很多访问网站需要代理,所以把它COPY出来备忘
2011-08-24 00:33 3115How To Get Started Using JN ... -
Jni中C++和Java的参数传递
2011-08-24 00:04 5126如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ... -
aaaaa
2011-08-24 00:04 1000如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ...
相关推荐
linux线程池代码(c++实现) 分两部: 1、创建线程池 2、创建任务、加入线程池 可以参考使用
一个通用的线程池实现代码,该代码即可以在Windows环境下运行,也可以在Linux环境下运行。
使用c++实现linux 的epoll tcp协议, 自己封装的c++ 还有一个c的没有上传 有需要的话 call我
一个写好的线程池类,拿去就可以使用!
这是Linux系统下进行多线程、线程池开发指导丛书,里面有详细代码示例。
这是一个很好很稳定的线程池源码,我自己项目中使用的,跑的很稳定,也很好扩展
Linux下面用C++实现的threadpool,支持扩展,对于初步接触线程池的童靴有帮助
网上有现成的cthreadpool的代码,是c版的,且没有任务队列功能,不能做到任务的安全退出,根据实际需要写了一个c++版的,本程序实现了c++的封装,并实现了任务池和线程安全退出。弥补了c版的不足 在linux调试通过并...
C++服务器LINUX下,线程池,高并发,大数据
一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO 特点: 基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。 使用epoll+线程池+异步网络IO模式开发,并发...
(牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...
在linux下对线程池的封装,实现线程同步,可以节省内存空间的使用
IBM资料库中学习资料,项目实用资料
一、C++、C内存池、内存泄漏调试的实现 二、Windows、Linux双平台线程池的实现. 三、一些标准编码的封装类实现. _base64Encode.h _urlEncode.h _utf8Encode.h base32Encode.cpp base32Encode.h base64Encode.cpp ...
在linux下运行的线程,学习线程和测试线程,以及创建线程池的开发贷代码,可以直接运行。
一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO。基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。使用epoll+线程池+异步网络IO模式开发,并发性能优越...
C++ Linux WebServer服务器 用C++实现的高性能WEB服务器,经过webbenchh压力测试可以实现上万的QPS 功能 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型; 利用正则与状态机解析HTTP请求报文,实现...
东方国信计费线程池c++版本,代码效率较高,大家可以参考下
1.使用epoll技术实现I/O复用,支持多客户端连接;...代码基本上关键部分都加上了备注,源代码是参考的https://www.nowcoder.com/courses上面的课程教学,建议直接看游双老师的书籍《Linux高性能服务器编程》