[英]Is it safe to use boost::asio::strand in this way?
說我有一個工人階級
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對象時,我可以取消引用shared _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已經被銷毀了。 這樣安全嗎? 或者可能發生一些未定義的行為?
哦,自從我的評論以來,我差點忘了這個問題:
對我來說很好看(如果你想象MyWorker :: Work作為免費功能,會更容易看到)。 它確實假設即使在strand對象被銷毀之后也可以包裝處理程序。 我認為沒關系,但我需要檢查一下。
我確實看過了實現,實際上,strand服務的實現是這樣的,即在破壞strand
實例之后讓處理程序與它們相關聯是安全的。
這使你的代碼很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.