gpt4 book ai didi

c++ - 以这种方式使用 boost::asio::strand 是否安全?

转载 作者:太空狗 更新时间:2023-10-29 22:56:15 25 4
gpt4 key购买 nike

说我有 worker 类(Class)

class MyWorker : public std::enable_shared_from_this<MyWorker> {
public:
MyWorker(boost::asio::io_service& ioService) : strand_(ioService) {}

void Work(int n) {
strand_.post([weak_this = weak_from_this(), n]() {
printf("work %d run from strand\n", n);
if (auto ptr = weak_this.lock()) ptr->DoWork(n);
});
}

void DoWork(int n) {
n_ = n;
printf("work %d done\n", n);
}

private:
boost::asio::io_service::strand strand_;
int n_;
};

任何人都可以将工作发布到工作对象,它将被排队并按顺序工作。当我想停止一个 worker 对象时,我可以取消引用共享 _ptr。挂起的工作不会调用对象(受 weak_ptr 保护)

这里是示例场景

int main() {
boost::asio::io_service ioService;
auto worker = std::make_shared<MyWorker>(ioService);

ioService.post([] () { printf("other work 1\n"); });
worker->Work(1);
ioService.post([] () { printf("other work 2\n"); });
worker->Work(2);

worker.reset(); // <- strand_ destroyed after this line

ioService.run();
return 0;
}

这个例子可以运行而不会崩溃。输出是

other work 1
work 1 run from strand
other work 2
work 2 run from strand

没有预期的“工作 1 完成”、“工作 2 完成”。

但是在我调用 io_service::run() 时,strand 已经被销毁了。这样安全吗?或者可能发生了一些未定义的行为?

最佳答案

哦,自从我发表评论后,我差点忘了这个问题:

Looks fine to me (much easier to see if you imagine MyWorker::Work as a free function). It does assume that it's okay to have wrapped handlers even after the strand object is destroyed. I think that is okay, but I'd need to check.

我确实查看了实现,实际上 strand 服务的实现是这样的,即在销毁 strand 实例后让处理程序与其关联是安全的。

这让你的代码没问题。

关于c++ - 以这种方式使用 boost::asio::strand 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677721/

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