[关闭]
@perkyoung 2015-07-08T13:47:02.000000Z 字数 2690 阅读 2923

linux C++多线程服务端开发

UNIX


线程安全的对象生命期管理

当析构函数遇到多线程

构造

销毁太难

作为数据成员的mutex不能保护析构

线程安全的Observer有多难

  1. 全局共享数据引发的lock contention
  2. 对象池的线程安全,如何完全,安全把对象放回去

空悬指针

jj

线程同步

线程同步四项原则,按照重要性排列:

互斥器

条件变量

解决互斥锁阻塞的问题

  1. int dequeue() {
  2. lock(mutex);
  3. while(queue.empty())
  4. {
  5. cond.wait();
  6. }
  7. int top = queue.front();
  8. queue.pop_front();
  9. return top;
  10. }
  11. void enqueue(int x){
  12. lock(mutex);
  13. queue.push_back(x);
  14. cond.notify();
  15. }

读写锁

效率不比mutex快。

信号量

条件变量和互斥锁的结合可以替代其功能,而且不易用错。

多线程服务器的适用场合与编程模型

多线程常见模型

默认情况下是第三种。

one loop per thread
推荐使用one loop per thread + thread pool

进程间通信的方式很多,pipe,FIFO,共享内存,消息队列,还有一些同步原语。
推荐使用TCP,因为如果多进程依然无法满足服务,就需要扩充到其他机器,易于扩展

如果用很少的cpu负载就能让IO跑满,或者用很少的IO流量就可疑让cpu跑满,那么多线程没啥用处。

适合多线程的场景

虽然多线程不能提高绝对性能,但能提高平均响应性能。

疑难解答

多线程日志

对于C++程序,最好整个程序使用相同的日志库,程序有一个正体的日志输出,而不要各个组件有各个组件的日志输出。一般的日志风格有两种

日志的功能需求

因为日志库不能每条消息都flush到硬盘,也不能每条日志都open/close文件(开销太大)。方法

日志消息格式要点:

日志的性能需求

日志库要足够高效。输出足够多的诊断信息,减小运维难度,提升效率。

性能指标

多线程异步日志
用多个buffer,缓冲

muduo网络库简介

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注