gpt4 book ai didi

c++ - 在 Boost.Asio 中完成工作项时如何调用函数?

转载 作者:行者123 更新时间:2023-11-30 01:16:15 25 4
gpt4 key购买 nike

我想实现一个命令队列,它与线程池同时处理传入的命令(因此当所有线程都在工作时,队列会暂时增长)。我想在命令工作人员启动和完成时向调用者发布回调。我的实现基于 this example来自 Asio 网站。

有没有办法 Hook 这些事件并以某种方式发出信号?我想避免命令仿函数知道回调(因为显然我可以在命令仿函数中调用回调)。

用于说明的伪代码(为简洁起见省略了初始化和错误处理):

class CommandQueue
{
public:
void handle_command(CmdId id, int param)
{
io_service.post(boost::bind(&(dispatch_map[id]), param));

// PSEUDOCODE:
// when one of the worker threads start with this item, I want to call
callback_site.cmd_started(id, param);

// when the command functor returns and the thread finished
callback_site.cmd_finished(id, param);
}

private:
boost::asio::io_service io_service;
asio::io_service::work work;
std::map<CmdId, CommandHandler> dispatch_map; // CommandHandler is a functor taking an int parameter
CallbackSite callback_site;
};

有没有办法在不让命令仿函数依赖于 CallbackSite 的情况下做到这一点?

最佳答案

我最初的 react 是 std::future这就是你想要的 现在甚至有built in support for them .但是,您已将其标记为 所以你将不得不使用 boost::future .

基本上你传入一个 boost::promise到您要传递给 asio 的任务,但事先调用 get_future 并存储与 promise 共享状态的 future。任务完成后,您可以调用 promise::set_value。在另一个线程中,您可以通过调用 future::is_ready(非阻塞)或 future::wait(阻塞)来检查是否发生了这种情况,然后检索值在调用适当的回调函数之前从中获取。

例如在您的示例中,值集可以是 CmdId 以确定调用哪个回调。

关于c++ - 在 Boost.Asio 中完成工作项时如何调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com