Продлить жизнь объекта

Есть некоторый Handler по обработке массивов данных

using Image = std::vector<char>;
using Images = std::vector<Image>;

class Handler : public std::enable_shared_from_this<Handler>
{
public:
    Handler(const std::shared_ptr<Sender>& sender)
        : m_sender(sender){}
        
    ~Handler() = default;

    void handleData(Images images)
    {
        auto asyncSend = std::bind(&Handler::makeMessage, this,
                               std::placeholders::_1,
                               std::placeholders::_2);

        AsioPool::run(std::move(asyncSend), std::move(images), shared_from_this());
    }

private:
    void makeMessage(Images images, std::shared_ptr<Handler> self)
    {
        Image result;
        for (const auto& image : images)
        {
            // Тяжелые вычисления
        }        
        m_sender->send(std::move(result));
    }
    
private:
    std::shared_ptr<Sender> m_sender;
};

в одном из потоков создается много этих Handler-ов

std::vector<std::shared_ptr<Handler> handlers;
for (...)
    handlers.emplace_back(std::make_shared<Handler>(sender_ptr));

Другой поток через Handler-ы обрабатывает данные

for (auto& handler : handlers)
    handler->handleData(std::move(images));

Третий поток, может удалить эти Handler-ы

handlers.clear();

В результате, в момент, когда AsioPool::run(...) дойдет до выполнения Handler::makeMessage самого объекта может уже не существовать, если не передавать в метод shared_from_this(). AsioPool::run(...) это обертка над бустовым asio, работает по принципу "отдал и забыл".

Какие есть еще методы продлить жизнь объекту, без передачи своего shared_ptr ?


Ответы (0 шт):