muduo -- base分析

1. Atomic.h // 原子操作接口封装,C++11已经实现 atomic 相关接口,更简洁些,推荐使用C++11内实现

std::atomic cur_max_sqlId_;

参考:https://zh.cppreference.com/w/cpp/atomic/atomic

2. CountDownLatch.h // 作类似于起跑线机制,值得学习一下

// latchdown之后然后调用wait.等待最后一个线程notifyAll
// 然后多个线程同时解除锁定就可以同时开始执行了
void CountDownLatch::wait()
{
    MutexLockGuard lock(mutex_);
    while (count_ > 0) {
        condition_.wait();
    }
}
// 每个线程启动成功后就执行latchdown,最后一个线程会notifyAll
void CountDownLatch::countDown()
{
    MutexLockGuard lock(mutex_);
    --count_;
    if (count_ == 0) {
        condition_.notifyAll();
    }
}

通常用作,主线程等待几个工作线程启动,等工作线程全部完成初始化+启动后,countdown 通知主线程wait返回。

3. Singleton.h // 单例模式,实现很有特点

  static T& instance()
  {
    pthread_once(&ponce_, &Singleton::init);
    assert(value_ != NULL);
    return *value_;
  }

3. Thread.h // 线程封装,内置静态变量记录创建多少个线程。每个线程分配一个递增计数。内部计数用的还是Atomic.h里面的可以考虑换成C++11 提供的atomic接口了。

T get()
{
// in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)
return __sync_val_compare_and_swap(&value_, 0, 0);
}

T getAndAdd(T x)
{
// in gcc >= 4.7: __atomic_fetch_add(&value_, x, __ATOMIC_SEQ_CST)
return __sync_fetch_and_add(&value_, x);
} 

4. ThreadPool.h  封装工作线程池。任务队列  std::deque queue_;   typedef boost::function Task;

// 外部丢入Task放到线程池内部
void ThreadPool::run(const Task& task)
{
  if (threads_.empty()) // 如果没有任何线程
  {
    task();
  }
  else
  {
    MutexLockGuard lock(mutex_);
    queue_.push_back(task);
    cond_.notify();
  }
}
ThreadPool::Task ThreadPool::take()
{
  MutexLockGuard lock(mutex_);
  while (queue_.empty() && running_)
  {
    cond_.wait();
  }
  Task task;
  if(!queue_.empty())
  {
    task = queue_.front();
    queue_.pop_front();
  }
  return task;
}
// 线程回调函数
void ThreadPool::runInThread()
{
  try
  {
    while (running_)
    {
      Task task(take());
      if (task)
      {
        task();
      }
    }
  }
}

 

 

你可能感兴趣的:(muduo -- base分析)