多线程的程序是比较常见的,更何况是网络程序。随着多核CPU的发展,想提高程序的性能,只能靠多线程工作了。下面就带你看看第二人生是怎么创建多线程工作的,每个线程又是做什么样的工作。由于线程类是主动类,线程的工作结构就是程序的工作结构了,写一个好的程序,往往就是线程类的结构安排,也就是整个程序的架构实现。并且每个线程之间的交互,都需要小心地进行着,一着不慎就全盘皆输,造成多个线程之间死锁的出现,因此写多线程程序,总要如履薄冰,小心翼翼。
#001 bool LLAppViewer::initThreads()
#002 {
定义是否允许跟内存。
#003 #if MEM_TRACK_MEM
#004 static const bool enable_threads = false;
#005 #else
#006 static const bool enable_threads = true;
#007 #endif
创建虚拟文件系统线程。
#008 LLVFSThread::initClass(enable_threads && true);
创建本地文件系统线程。
#009 LLLFSThread::initClass(enable_threads && true);
#010 
创建图像解码线程。
#011 // Image decoding
#012 LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
创建纹理缓存线程。
#013 LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
创建获取纹理线程。
#014 LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
#015 LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
#016 LLImageJ2C::openDSO();
#017 
#018 // *FIX: no error handling here!
#019 return true;
#020 }
在程序创建时,先创建了一个界面线程,再加上面创建的线程,相互协作地工作,实现了更好的运行性能,并且每部份逻辑上比较独立分离,写起程序来也比较方便,容易理解程序的工作方式。

第二人生的源码分析(四十)创建多个工作线程相关推荐

  1. 【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  2. 【转】ABP源码分析四十二:ZERO的身份认证

    ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...

  3. 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  4. 【转】ABP源码分析四十四:ZERO的配置

    ABP Zero模块中需要配置的地方主要集中在三块:1.配置静态的role:2.配置外部认证源:3.配置本地化语言和资源. UserManagementConfig/IUserManagementCo ...

  5. 【转】ABP源码分析四十:ZERO的Application和Tenant

    ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...

  6. ABP源码分析四十:ZERO的Application和Tenant

    ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...

  7. 第二人生的源码分析(二十六)底层网络协议

    为了理解第二人生的客户端与服务器的沟通,那么下面就来分析一下第二人生采用的网络协议.在目前的网络里,主要有两个协议:TCP和UDP,而第二人生里是采用UDP协议.TCP协议与UDP协议的主要区别,就是 ...

  8. spark 源码分析之十九 -- DAG的生成和Stage的划分

    上篇文章 spark 源码分析之十八 -- Spark存储体系剖析 重点剖析了 Spark的存储体系.从本篇文章开始,剖析Spark作业的调度和计算体系. 在说DAG之前,先简单说一下RDD. 对RD ...

  9. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

  10. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

最新文章

  1. Spring DAO之JDBC
  2. OpenCV Mat数据类型像素操作
  3. linux文件IO——文件IO介绍
  4. (王道408考研数据结构)第三章栈和队列-第一节:栈基本概念、顺序栈和链栈基本操作
  5. django-websocket 安装及配置
  6. Swift 3.0 (二)
  7. 将TreeView中导出为XML数据
  8. css: position的使用;
  9. Spring AMQP + Rabbit 配置多数据源消息队列
  10. HTML+JS调用摄像头拍照并上传图片
  11. 笔记本安装linux无线网卡,笔记本安装centos7 无线网卡启动不起来,那位大神看看?...
  12. linux下phylip软件构建NJ树,SNP数据构建系统进化树
  13. VScode绘制波形图
  14. R语言绘制带误差和可信区间的折线图
  15. pgadmin mac卸载_Mac软件卸载——安全彻底地在Mac上卸载Microsoft Outlook - Mac迪迪卫...
  16. apache(阿帕奇)的基本配置1
  17. 微信小程序获取当前位置及地图选点功能
  18. Matlab 风电出力概率评估,风速不确定,设备故障不确定性。马尔可夫,蒙特卡洛算法。
  19. 「Photoshop2021入门教程」给照片添加烟雾效果
  20. uniapp+高德地图api 获取定位信息及详细地址

热门文章

  1. 淘宝API(拍立淘)———图片搜索
  2. Autodesk BIM 360 全球在线骇客马拉松
  3. 铂电阻测温电路c语言程序,pt100测温电路(经典测温范围)
  4. 修改Office 2016安装路径的方法
  5. mipi的dsi全称_mipi协议里面csi和dsi是什么意思
  6. 什么是EDI报文标准?
  7. 安装oracle18c前要求,oracle18c安装
  8. php 设置允许跨域请求
  9. Combining Label Propagation and Simple Models Out-performs Graph Neural Networks 论文理解
  10. css3直线运动_纯CSS3炫酷元素边框线条动画特效