illx10000

青春不是年华,而是心境

brpc学习(二)

2018年12月22日 星期六, 发表于 深圳

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)


brpc util中有很多有用的库,brpc学习一 中已经介绍了一部分,本文接上文,继续学习了解brpc的基础类库

如果文章有任何冒犯之处,如侵权或者未标明引用,请邮件联系删除

1. atext

在这篇博文里面坐着介绍到: https://blog.csdn.net/drdairen/article/details/51896141

简单的说,exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容将刷新定义,并调用所有已刷新的“出口函数”(由atexit定义)

也就是说给系统注册一个进程退出回调函数,当进程退出的时候,调用相应的回调函数

2. AtExitManager

AtExitManager功能类似于atexit函数,当类AtExitManager析构的时候,会调用RegisterCallback函数注册的回调函数;

AtExitManager::~AtExitManager() {
  if (!g_top_manager) {
    NOTREACHED() << "Tried to ~AtExitManager without an AtExitManager";
    return;
  }
  DCHECK_EQ(this, g_top_manager);

  ProcessCallbacksNow();
  g_top_manager = next_manager_;
}

// static
void AtExitManager::ProcessCallbacksNow() {
  if (!g_top_manager) {
    NOTREACHED() << "Tried to ProcessCallbacksNow without an AtExitManager";
    return;
  }

  AutoLock lock(g_top_manager->lock_);

  while (!g_top_manager->stack_.empty()) {
    Callback task = g_top_manager->stack_.top();
    task.func(task.param);
    g_top_manager->stack_.pop();
  }
}

3. AutoReset

AutoReset类用于在某一个范围类将某一个变量设置为新的值,实现原理,类似于上面的AtExitManager,构造赋值,析构还原;

  AutoReset(T* scoped_variable, T new_value)
      : scoped_variable_(scoped_variable),
        original_value_(*scoped_variable) {
    *scoped_variable_ = new_value;
  }

  ~AutoReset() { *scoped_variable_ = original_value_; }