#include <thread>
#include <atomic>
#include <print>

struct data
{
    int foo;
    int bar;
};
std::atomic<data*> shared_data;

int main()
{
    std::thread announcer([](){
        sleep(2);

        data* local_data = new data;
        local_data->foo = 42;
        local_data->bar = 666;
        shared_data.store(
            local_data, 
            std::memory_order_release);                // <-- let-go
    });

    while (true)
    {
        data* local_data = shared_data.load(
            std::memory_order_acquire);                // <-- all there?
        if (local_data) {
            std::println("foo {}, bar {}", local_data->foo, local_data->bar);
            break;
        }
    }

    announcer.join();
    delete shared_data;
    return 0;
}
