gpt4 book ai didi

c++ - 如何使异步函数中使用其成员的 shared_ptr 对象保持事件状态?

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:27 26 4
gpt4 key购买 nike

想象一下下面的代码:

void async(connection *, std::function<void(void)>);

void work()
{
auto o = std::make_shared<O>();
async(&o->member, [] { do_something_else(); } );
}
例如,

async 将使用作为指针传递的 omember 启动一个线程。但是当 oasync() 被调用后立即超出范围时这样写,它将被删除,成员也将被删除。

如何正确且很好地解决这个问题(!)?

显然 one solution就是将o传递给捕获列表。即使不使用,也保证不会优化捕获。

  async(&o->member, [o] { do_something_else(); } );

但是,最近的编译器 (clang-5.0) 在 -Wextra 集合中包含了 -Wunused-lambda-capture。这种情况会产生 unused-lambda-capture 警告。

我在 lamdba 中添加了 (void) o; 以消除此警告。

  async(&o->member, [o] { 
(void) o;
do_something_else();
});

有没有更优雅的方法来解决这个作用域问题?

(这个问题的由来源于using write_async of boost::asio)

最佳答案

Boost.Asio 似乎 suggest使用 enable_shared_from_this让拥有“connection”的任何东西在有使用它的未决操作时保持事件状态。例如:

class task : std::enable_shared_from_this<task> {
public:
static std::shared_ptr<task> make() {
return std::shared_ptr<task>(new task());
}

void schedule() {
async(&conn, [t = shared_from_this()]() { t->run(); });
}

private:
task() = default;

void run() {
// whatever
}

connection conn;
};

然后使用task:

auto t = task::make();
t->schedule();

这似乎是个好主意,因为它将调度和执行 task 的所有逻辑封装在 task 本身中。

关于c++ - 如何使异步函数中使用其成员的 shared_ptr 对象保持事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43246983/

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