本文主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常用的线程模型,归纳了进程间通讯与线程同步的最佳实践,以期用简单规范的方式开发多线程程序。
文中的“多线程服务器”是指运行在Linux操作系统上的独占式网络应用程序。硬件平台为Intelx64系列的多核CPU,单路或双路SMP服务器(每台机器一共拥有四个核或八个核,十几GB内存),机器之间用百兆或千兆以太网连接。这大概是目前民用PC服务
器的主流配置。
本文不涉及Windows系统,不涉及人机交互界面(无论命令行或图形);不考虑文件读写(往磁盘写log 除外),不考虑数据库操作,不考虑Web应用;不考虑低端的单核主机或嵌入式系统,不考虑手持式设备,不考虑专门的网络设备,不考虑高端的>=32核Unix主机;只考虑TCP,不考虑UDP,也不考虑除了局域网络之外的其他数据收发方式(例如串并口、USB口、数据采集板卡、实时控制等)。
有了以上这么多限制,那么我将要谈的“网络应用程序”的基本功能可以归纳为“收到数据,算一算,再发出去”。在这个简化了的模型里,似乎看不出用多线程的必要,单线程应该也能做得很好。“为什么需要写多线程程序”这个问题容易引发口水战,我放到另一篇博客里讨论。请允许我先假定“多线程编程”这一背景。
“服务器”这个词有时指程序,有时指进程,有时指硬件(无论虚拟的或真实的),请注意按上下文区分。另外,本文不考虑虚拟化的场景,当我说“两个进程不在同一台机器上”,指的是逻辑上不在同一个操作系统里运行,虽然物理上可能位于同一机器虚拟出来的两台“虚拟机”上。
本文假定读者已经有多线程编程的知识与经验,这不是一篇入门教程。
本文承蒙MiloYip先生审读,在此深表谢意。当然,文中任何错误责任均在我。
目录
1进程与线程…………………………………………………………2
2典型的单线程服务器编程模型……………………..3
3典型的多线程服务器的线程模型………………3
Oneloopperthread………………………………4
线程池………………………………………4
归纳………………………………………………………..5
4进程间通信与线程间通信……………………….5
5进程间通信……………………………………………….6
6线程间同步…………………………….7
互斥器(mutex)………………………..7
跑题:非递归的mutex………………8
条件变量………………………………………10
读写锁与其他………………………………………………….11
封装MutexLock、MutexLockGuard和Condition………………..11
线程安全的Singleton实现…………….14
归纳…………………………………………………………………………………15
7总结…………………………………………………………….16
后文预览:Sleep反模式……………………………..16
PDF下载 多线程服务器的常用编程模型
转载请注明:爱开源 » 多线程服务器的常用编程模型