c++ 在类成员协程中安全访问this指针

lnlaulya  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(158)

问题是对象可能在协程完成之前被销毁。
我已经通过使用C++/WinRT工具解决了这个问题。但我感兴趣的是你如何用c++标准库解决它。
这个问题被无耻地从https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/weak-references中重新利用了

struct MyClass
{
    std::string m_value{ "Hello, World!" };

    Task<std::string> RetrieveValueAsync()
    {
        co_await 5s; // resumes on thread pool
        co_return m_value;
    }
};

int main()
{
    auto instance = std::make_shared<MyClass>();
    auto async = instance->RetrieveValueAsync();
    instance = nullptr; // Simulate the class instance going out of scope.

    std::string result = async.get(); // Behavior is now undefined; crashing is likely.
    std::cout << result.c_str() << std::endl;
}
gpnt7bae

gpnt7bae1#

也可以使用std::enable_shared_from_this<>

struct MyClass : std::enable_shared_from_this<MyClass>
{
    std::string m_value{ "Hello, World!" };

    Task<std::string> RetrieveValueAsync()
    {
        auto lock_me = shared_from_this();

        co_await 5s; // resumes on thread pool
        co_return m_value;
    }
};
vjrehmav

vjrehmav2#

你需要做的是在协程中找到shared_ptr

struct MyClass
{
    static auto make_shared()
    {
        auto result = std::make_shared<MyClass>();
        result->weak = result;
        return result;
    }
    std::weak_ptr<MyClass> weak{nullptr};
    std::string m_value{ "Hello, World!" };

    Task<std::string> RetrieveValueAsync()
    {
        std::shared_ptr<MyClass> strong = weak.lock();
        co_await 5s;
        co_return m_value;
    }
};

相关问题