brpc定时器,即bthread_timer_t,是另外开一个线程来定时执行操作,封装了bthread_timer_add等方法,头文件是<bthread/unstable.h>。下面是示例代码:
#include <memory>
#include <string>
#include <bvar/bvar.h>
#include <bvar/status.h>
#include <bthread/unstable.h>
class BrpcTimer {
public:
static BrpcTimer& GetInstance() {
static BrpcTimer instance;
return instance;
}
void Start();
private:
BrpcTimer();
~BrpcTimer();
void Clear();
static void TaskClear(void* arg);
bthread_timer_t clear_map_timer_;
};
#include "brpc_timer.h"
#include <butil/object_pool.h>
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <time.h>
DEFINE_int32(clear_memory_every_sec, 3, "");
BrpcTimer::BrpcTimer() {
CHECK_EQ(0, bthread_timer_add(
&clear_map_timer_,
butil::seconds_from_now(FLAGS_clear_memory_every_sec),
TaskClear,
this)) << "Failed to create clear map timer.";
}
BrpcTimer::~BrpcTimer() {
CHECK_EQ(0, bthread_timer_del(clear_map_timer_)) << "Failed to del clear map timer";
}
void BrpcTimer::Start() {
LOG(ERROR) << "BrpcTimer::Start";
}
void BrpcTimer::TaskClear(void* arg) {
BrpcTimer* brpc_timer = reinterpret_cast<BrpcTimer*>(arg);
brpc_timer->Clear();
CHECK_EQ(0, bthread_timer_add(
&brpc_timer->clear_map_timer_,
butil::seconds_from_now(FLAGS_clear_memory_every_sec),
TaskClear,
brpc_timer)) << "Failed to create clear map timer.";
}
void BrpcTimer::Clear() {
LOG(ERROR) << "BrpcTimer::Clear";
}
主函数:
#include <iostream>
#include "brpc_timer.h"
using namespace std;
int main(int argc, char const *argv[])
{
BrpcTimer::GetInstance().Start();
while(1) {
sleep(1);
}
return 0;
}
blade编译:
cc_binary(
name = 'timer',
srcs = 'timer.cpp',
deps = [
':brpc_timer',
'#brpc',
]
)
cc_library(
name = 'brpc_timer',
srcs = 'brpc_timer.cpp',
deps = [
'#brpc',
]
)
注意:
1. bthread_timer_add函数中的实例参数,即第四个参数,必须要在brpc框架初始化后生成,否则无效。
在使用单例时,用上述懒加载的方式生成实例,不能在GetInstance函数外创建实例,也就是创建实例不能过早,要等brpc框架初初始化完成。
2. bthread_timer_add函数需要递归循环调用,不能只调用一次。