- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多线程服务器的常用编程模型
多线程服务器的常用编程模型
陈硕 (giantchen_AT_gmail)
B/Solstice
2009Feb 12
本文主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常用的线程模型,
归纳了进程间通讯与线程同步的最佳实践,以期用简单规范的方式开发多线程程序。
文中的“多线程服务器”是指运行在 Linux 操作系统上的独占式网络应用程序。硬件
平台为 Intelx64 系列的多核 CPU,单路或双路 SMP 服务器(每台机器一共拥有四个核或
八个核,十几 GB 内存),机器之间用百兆或千兆以太网连接。这大概是目前民用 PC 服务
器的主流配置。
本文不涉及 Windows 系统,不涉及人机交互界面(无论命令行或图形);不考虑文件
读写(往磁盘写 log 除外),不考虑数据库操作,不考虑 Web 应用;不考虑低端的单核主
机或嵌入式系统,不考虑手持式设备,不考虑专门的网络设备,不考虑高端的 =32 核 Unix
主机;只考虑 TCP,不考虑 UDP,也不考虑除了局域网络之外的其他数据收发方式(例如
串并口、USB口、数据采集板卡、实时控制等)。
有了以上这么多限制,那么我将要谈的“网络应用程序”的基本功能可以归纳为“收到
数据,算一算,再发出去”。在这个简化了的模型里,似乎看不出用多线程的必要,单线程
应该也能做得很好。“为什么需要写多线程程序”这个问题容易引发口水战,我放到另一篇
博客里讨论。请允许我先假定“多线程编程”这一背景。
“服务器”这个词有时指程序,有时指进程,有时指硬件(无论虚拟的或真实的),请
注意按上下文区分。另外,本文不考虑虚拟化的场景,当我说“两个进程不在同一台机器上”,
指的是逻辑上不在同一个操作系统里运行,虽然物理上可能位于同一机器虚拟出来的两台
“虚拟机”上。
本文假定读者已经有多线程编程的知识与经验,这不是一篇入门教程。
本文承蒙 MiloYip 先生审读,在此深表谢意。当然,文中任何错误责任均在我。
目 录
1 进程与线程2
2 典型的单线程服务器编程模型3
3 典型的多线程服务器的线程模型3
Oneloopperthread4
线程池4
归纳5
4 进程间通信与线程间通信5
5 进程间通信6
6 线程间同步7
互斥器 (mutex)7
1
跑题:非递归的 mutex8
条件变量10
读写锁与其他11
封装 MutexLock、MutexLockGuard 和 Condition11
线程安全的 Singleton 实现14
归纳15
7 总结16
后文预览:Sleep 反模式16
1 进程与线程
“进程/process”是操作里最重要的两个概念之一(另一个是文件),粗略地讲,一个
进程是“内存中正在运行的程序”。本文的进程指的是 Linux 操作系统通过 fork() 系统调
用产生的那个东西,或者 Windows 下 CreateProcess() 的产物,不是 Erlang 里的那种轻
量级进程。
每个进程有自己独立的地址空间 (addressspace),“在同一个进程”还是“不在同一个
进程”是系统功能划分的重要决策点。Erlang 书把“进程”比喻为“人”,我觉得十分精当,
为我们提供了一个思考的框架。
每个人有自己的记忆 (memory),人与人通过谈话(消息传递)来交流,谈话既可以是
面谈(同一台服务器),也可以在电话里谈(不同的服务器,有网络通信)。面谈和电话谈的
区别在于,面谈可以立即知道对方死否死了(crash,SIGCHLD),而电话谈只能通过周期性
的心跳来判断对方是否还活着。
有了这些比喻,设计分布式系统时可以采取“角色扮演”,团队里的几个人各自扮演一
个进程,人的角色由进程的代码决定(管登陆的、管消息分发的、管买卖的等等)。每个人
有自己的记忆,但不知道别人的记忆,
文档评论(0)