C++:shared_from_this()应用在异步任务中的应用

shared_from_this() 的主要用途是安全地创建 std::shared_ptr 实例来管理当前对象的生命周期,确保对象在异步任务或新线程中不会在使用过程中被销毁。示例如下:

示例代码:

#include <iostream>
#include <memory>
#include <thread>
#include <chrono>

class AsyncWorker : public std::enable_shared_from_this<AsyncWorker> {
public:
    AsyncWorker(const std::string& name) : name(name) {
        std::cout << "AsyncWorker created: " << name << std::endl;
    }

    ~AsyncWorker() {
        std::cout << "AsyncWorker destroyed: " << name << std::endl;
    }

    void startAsyncTask() {
        // Capture shared pointer to ensure the object stays alive during task execution
        std::shared_ptr<AsyncWorker> self = shared_from_this();
        std::thread([self]() {
            std::cout << "Async task started for: " << self->name << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(2));  // Simulate some work
            std::cout << "Async task completed for: " << self->name << std::endl;
        }).detach(); // Detach the thread to allow it to run independently
    }

private:
    std::string name;
};

int main() {
    std::shared_ptr<AsyncWorker> worker = std::make_shared<AsyncWorker>("Task1");
    worker->startAsyncTask();

    // Simulate some work in main thread
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Main thread exiting..." << std::endl;

    // The async task should complete before the program exits
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return 0;
}

代码说明:

  1. 类继承AsyncWorker 类继承了 std::enable_shared_from_this<AsyncWorker>,这使得可以在类的成员函数中使用 shared_from_this() 来获取一个指向当前对象的 std::shared_ptr
  2. 生命周期管理:当 startAsyncTask 被调用时,shared_from_this() 创建了一个新的 std::shared_ptr,从而确保 AsyncWorker 对象在异步任务完成之前不会被销毁。
  3. 异步任务:一个新的线程被创建,执行异步任务。在此任务中,捕获的 std::shared_ptr 确保 AsyncWorker 对象的生命周期被正确管理。
  4. 线程管理:使用 std::thread::detach() 使线程独立运行。任务完成时,std::shared_ptr 会自动销毁。

运行结果示例:

AsyncWorker created: Task1
Async task started for: Task1
Main thread exiting...
Async task completed for: Task1
AsyncWorker destroyed: Task1

说明:

  • 当主线程在 1 秒后结束时,异步任务仍在运行,但由于使用了 shared_from_this()AsyncWorker 对象在任务完成之前不会被销毁。
  • 如果没有使用 shared_from_this() 并只是传递裸指针或常规 this 指针到异步任务中,可能会引发未定义行为,因为对象可能会在异步操作期间被销毁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值