簡體   English   中英

以這種方式使用boost :: asio :: strand是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM