#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);

        {
            std::scoped_lock _(shared_data_lock);      // <-- protect all and more

            data* local_data = new data;
            local_data->foo = 42;
            local_data->bar = 666;
            shared_data = local_data;
        }
    });

    while (true)
    {
        std::scoped_lock _(shared_data_lock);          // <-- protect all and more
        if (shared_data) {
            std::println("foo {}, bar {}", shared_data->foo, shared_data->bar);
            break;
        }
    }

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