c ++类

时间:2017-01-14 16:00:39

标签: c++ c++11 boost

我们要求使用授权调用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?有什么例子吗?

1 个答案:

答案 0 :(得分:1)

您希望实现的目标有两种方法。

  1. 如果您不想涉及多线程。您可以在Timer课程中添加Authorization,计时器将在5分钟后过期,在发送请求之前检查令牌是否已过期。
  2. 使用另一个线程每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;
    };