#include #include struct some_resource { void do_something() {} }; std::shared_ptr resource_ptr; std::mutex resource_mutex; void foo() { std::unique_lock lk(resource_mutex); if (!resource_ptr) { resource_ptr.reset(new some_resource); } lk.unlock(); resource_ptr->do_something(); } int main() { foo(); }