#include <thread>
#include <mutex>
#include <print>

struct data
{
    int foo;
    int bar;
};
data* shared_data;
std::mutex shared_data_lock;

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

        data* local_data = new data;
        local_data->foo = 42;
        local_data->bar = 666;
        {
            std::scoped_lock _(shared_data_lock);      // <-- protect store
            shared_data = local_data;
        }
    });

    while (true)
    {
        data* local_data;
        {
            std::scoped_lock _(shared_data_lock);      // <-- protect load
            local_data = shared_data;
        }
        if (local_data) {
            std::println("foo {}, bar {}", local_data->foo, local_data->bar);
            break;
        }
    }

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