Вам не нужен указатель, будь он необработанным или общим, просто используйте ссылку:
struct Foo {
int i_;
Foo(int i) :i_(i) { std::cout << "Foo:" << i_ << "\n"; }
~Foo() { std::cout << "~Foo" << i_ << "\n"; }
};
class FooSingleton
{
public:
static FooSingleton& GetInstance()
// ^
{
static FooSingleton theInstance;
return theInstance;
}
Foo foo() {
std::lock_guard<std::mutex> lock(mutex1);
return Foo;
}
void foo(const Foo& value) {
std::lock_guard<std::mutex> lock(mutex1);
foo_ = value;
}
private:
FooSingleton() : foo_(42) {
}
std::mutex mutex1;
Foo foo_;
};
Meyers 'Singleton гарантированно безопасен для потоков.
Используйте экземпляр mutex для синхронизации любых операций, выполняемых с вашим синглтоном, в случае необходимости обеспечения безопасности потока.