在我们日常生活中会遇到许许多多的问题,如果一个服务端要接受很多客户端的数据,该怎么办?多线程并发内存不够怎么办?所以我们需要了解线程池的相关知识。
1.线程池的简介
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
2.线程池的组成
1、线程池管理器(ThreadPoolManager):用于创建并管理线程池
2、工作线程(WorkThread): 线程池中线程
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。
3.线程池的主要优点
1.避免线程太多,使得内存耗尽
2.避免创建与销毁线程的代价
3.任务与执行分离
1.线程池结构体定义
代码如下(示例):
相关视频推荐
150行代码,带你手写线程池,自行准备linux环境
C++后台开发该学哪些内容,标准技术路线及面经与算法该如何刷
学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
需要更多C/C++ Linux服务器架构师学习资料加qun 812855908 (资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)
2.接口定义
代码如下(示例):
3.回调函数
代码如下(示例):
4.全部代码(加注释)
代码如下(示例):
关于线程池是基本代码就在上面了,关于编程这一部分内容,我建议大家还是要自己去动手实现,如果只是单纯的看了一遍,知识这块可能会记住,但是 *** 作起来可能就比较吃力,万事开头难,只要坚持下去,总会有结果的。
多线程程序中,特别是频繁申请,释放线程的情况下,就要注意线程的关闭,最好使用线程池。一,线程退出方式
(1) 执行完成后隐式退出;
(2) 由线程本身显示调用pthread_exit 函数退出;
pthread_exit (void * retval)
(3) 被其他线程用pthread_cance函数终止:
pthread_cance (pthread_t thread)
二,线程状态
pthread 线程有两种状态,joinable(非分离)状态和detachable(分离)状态,默认为joinable。
joinable:当线程函数自己返回退出或pthread_exit时都不会释放线程所用资源,包括栈,线程描述符等(有人说有8k多,未经验证)。
detachable:线程结束时会自动释放资源。
joinable 线程执行完后不使用pthread_join的话就会造成内存泄漏。
解决办法:
1、创建线程前设置 PTHREAD_CREATE_DETACHED 属性
pthread_attr_t attr
pthread_t thread
pthread_attr_init (&attr)
pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED)
pthread_create (&thread, &attr, &thread_function, NULL)
pthread_attr_destroy (&attr)
2、当线程为joinable时,使用pthread_join来获取线程返回值,并释放资源。
3、当线程为joinable时,也可在线程中调用 pthread_detach(pthread_self())来分离自己。
首先需要安装boost,步骤如下:
下载到 boost_1_49_0.tar.bz2 (当然,其他压缩格式也可以)后,可以把它放在用户目录下,即:~/
解压缩:tar -jxvf boost_1_49_0.tar.bz2
这样,出现文件夹:~/boost_1_49_0
然后进入:$ cd boost_1_49_0
你会发现有一�¸.shå½ä»¤ï¼bootstrap.sh
è¿è¡å®ï¼$ ./bootstrap.sh ï¼boostèªå·±çget startææ¡£ä¸è¯´è®¾ç½®åæ° --prefix=dir å ¶ä¸dirä¸ºä½ æ³æå®çå®è£ æ件夹ï¼æ建议就ä¸ç¨å è¿ä¸ªåæ°ï¼å®ä¼é»è®¤å®è£ å°/usr/localï¼
ç»æååºç°ä¸ä¸ªå¯æ§è¡æä»¶ï¼ ~/boost_1_49_0/b2
è¿è¡è¿ä¸ªæä»¶ï¼ $ sudo ./b2 install ï¼Ubuntuç¨æ·åä¸å«å¿äºå sudoï¼ä¸ç¶å®è£ åå°æ æ³å®å ¨ä½¿ç¨ï¼
ç¼è¯å®è£ æ¶é´æ¯è¾é¿ï¼æ ¹æ®ä¸åæºå¨çæ åµ20ï½40åéãç»æåå³å®è£ å®æ¯ã
boost::threadç使ç¨
#include <boost/thread.hpp>#include <iostream>
void task1() {
// do stuff
std::cout << "This is task1!" << std::endl
}
void task2() {
// do stuff
std::cout << "This is task2!" << std::endl
}
int main (int argc, char ** argv) {
using namespace boost
thread thread_1 = thread(task1)
thread thread_2 = thread(task2)
// do other stuff
thread_2.join()
thread_1.join()
return 0
}
ç¼è¯æ¶çå½ä»¤ä¸ºï¼
$ g++ -I./inlcude -L./lib example.cpp -lboost_thread -o example
ç¼è¯ä¹åä¼åºç°ä¸ä¸ª example çå¯æ§è¡æ件ï¼å¯ä»¥è¿è¡ï¼./example ï¼ ç»ææ¾ç¤ºï¼
This is task2!
This is task1!
å¯è½ä½ å¨è¿è¡æ¶ä¼åºç°è¿æ ·çé误ï¼error while loading shared libraries: libboost_thread.so.1.49.0: cannot open shared object file: No such file or directory
è¿æ¯å 为è¦ç¨å°çåºä¸å¨é»è®¤çç¯å¢åééï¼å¯ä»¥ä½¿ç¨ä¸é¢çå½ä»¤æ·»å ï¼
$ sudo ldconfig /usr/local/lib
æ·»å åï¼åæ§è¡./exampleï¼è¿æ ·ä½ å°±å®æäºä½ ç第ä¸ä¸ªboost::threadç¨åºã
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)