
preface为什么要创建新线程*MGR()放到attachthread参数里面有什么用一、为什么要创建新线程日志系统需要单独一个线程核心原因是异步写日志。如果没有独立线程同步写日志业务线程 ↓ 调用 log2file ↓ 直接写磁盘 ← 磁盘 I/O 很慢可能几毫秒到几十毫秒 ↓ 写完才能继续业务逻辑 ← 业务被阻塞了有了独立日志线程异步写日志业务线程 日志线程独立运行 ↓ ↓ 调用 log2file() 不断从队列取日志 ↓ ↓ 把日志消息塞进队列 写入磁盘文件 ↓立刻返回不等待 继续执行业务逻辑好处很明显业务线程不被 I/O 阻塞性能更好日志线程专职写盘有序、不竞争多个业务线程都可以同时往队列里丢日志日志线程统一消费二、*MGR()传进attahthread()有什么用先看调用ManageTHREAD::attach(*MGR());// ↑// 解引用得到 日志类Mgr对象的引用attach()的签名是staticintattachghread(THREADt);// 接收的是引用所以*MGR()传进去之后在attachthread()内部就是t它的作用贯穿整个函数// 1. 用它来同步父子线程握手t.mutex_acquire_lock();t.wait_Condition_Lock();t.signal_Condition_Lock();t.mutex_free_lock();// 2. 把它的指针传给新线程作为参数THREAD*ptdynamic_castTHREAD*(t);pthread_create(tid,attribute,start_routine,(void*)pt);// ↑// 新线程拿到这个指针后// 就能操作 日志类Mgr 对象本身关键点新线程拿到的是同一个对象MGR() 返回 日志类Mgr 的单例指针 *MGR() 解引用为对象引用传入 attachthread() t → pt 在 attachthread() 内部取回指针 pthread_create 把 pt 传给新线程的入口函数 start_routine所以新线程启动后拿到的pt和MGR()指向的是同一个日志类Mgr对象可以直接调用它的方法读队列、写日志、更新状态等。整体关系图主线程 MGR() ──────────────────────────┐ ↓ │ 同一个对象 *MGR() 传入 attachthread() │ ↓ │ pthread_create(pt) ─────→ 日志线程 │ start_routine(pt) ↓ pt-onRun() // 日志类Mgr的业务循环 从队列取日志写文件...简单说* MGR()传进去就是告诉Manage——“帮我把这个日志对象跑在一个新线程里”。