我们要求使用授权调用http服务 令牌。因此,为了得到“结果”,我们需要分两步完成。 首先进行http调用以从auth服务器获取授权令牌 然后使用令牌使第二个http获得“结果”(传递 标题中的身份验证令牌。
我们需要增强这个“简单”的两个http调用模型,因为我们可以重用 认证令牌有一段时间,例如5分钟。所以我们可以调用auth服务器 获取令牌并在5分钟内更新令牌,依此类推。
我们希望在一个C ++类中拥有它,所以从我们的主函数来做到这一点
//main.cpp
Authorization auth_obj; //global
int main(...)
{
auth_obj::initialize(); //call a static function
process_loop(); //for ever
}
process_loop() {
select(...) {
details = auth_obj->get_auth_details();
http->add_header(details);
"result" = http->getResult();
}
}
//Authorization.cpp
class Authorization {
details_t auth_details_;
get_auth_details( return auth_details_;)
initialize(){
auth_details = http->get_token_from_server();
save(auth_details)
renew(5 minutes);
}
save(auth_details) { auth_details = auth_details}
renew(time argument) {
//blocks here for 5 minutes
}
}
上面这个伪代码的问题是,当我们调用initialize时,执行将在Authorization :: renew(...)中阻塞。
我们需要的是调用initialize,获取第一个令牌,并在5分钟后授权类实例自动续订令牌并在那里等待接下来的5分钟,依此类推。
这样做的正确方法是什么? boost :: async,boost :: threads,std :: threads?有什么例子吗?
答案 0 :(得分:1)
您希望实现的目标有两种方法。
Timer
课程中添加Authorization
,计时器将在5分钟后过期,在发送请求之前检查令牌是否已过期。使用另一个线程每5分钟更新一次令牌。在这种情况下,您可以使用std::thread
并创建线程来更新令牌,如下所示:
class Authorization
{
public:
Authorization() = default;
~Authorization()
{
token_update_thread.detach();
}
details_t get_auth_details()
{
std::lock_guard<std::mutex> lock(token_lock);
return auth_details_;
}
void initialize()
{
token_update_thread = std::move(std::thread([this]()
{
while (true) {
renew();
std::this_thread::sleep_for(
std::chrono::minutes(5));
}
}));
}
void renew()
{
std::lock_guard<std::mutex> lock(token_lock);
// do whatever you need to update auth_details_
}
std::mutex token_lock;
details_t auth_details_;
std::thread token_update_thread;
};