Chapter 1 线程安全的对象生命期管理
综述:
线程安全:
对象的创建:
一个函数如果要锁住相同类型的多个对象,为保证始终按照相同的顺序加锁,可以比较mutex对象的地址,始终先加锁地址较小的mutex。
shared_ptr/weak_ptr
shared_ptr技术与陷阱
意外延长对象的生命周期
小结
(1)原始指针暴露给多个线程往往会造成race condition
(2)统一用shared_ptr来管理对象的生命期。
(3)shared_ptr是值语义,当心意外延长对象的生命期,例如boost::bind和容器都可能会拷贝shared_ptr
(4)weak_ptr是shared_ptr的好帮手,可以用作弱回调。
Chapter 2 线程同步精要
并发编程的2种模型:message passing/shared memory。前者使用范围更广。
线程同步四项原则
互斥器(mutex)
条件变量(condition variable)
不要用读写锁和信号量
sleep不是同步原语
它不具备memory barrier语义,无法保证内存可见性
Chapter 3 多线程服务器的适用场合与常用编程模型
进程与线程
非阻塞IO+IO复用(单线程服务器)
多线程服务器常用编程模型
one loop per thread
程序中的每个IO线程都有一个event loop(reactor),用于处理读写和定时事件(周期或单次)
对于没有IO只有计算任务的线程,使用event loop有点浪费,可以使用blocking queue实现的任务队列。
进程间通信只用TCP
TCP是双向的。
TCP port由进程独占,且操作系统会自动回收。
TCP可记录可重现,还可以跨语言。
TCP连接是可再生的。
分布式系统中推荐使用TCP长连接通信
多线程服务器适用场合
必须用单线程场合
对于一些辅助性程序,如果必须和主要服务器进程运行在同一台机器,那么把它做成单线程可以避免过分抢占系统计算资源。
缺点: