Я столкнулся с проблемой, подобной этой, и я думаю, что это должно работать, даже если основной поток выходит первым и забирает статические объекты. Вместо этого:
Singleton &get_singleton() {
static Singleton singleton;
return singleton;
}
Я думаю
Singleton &get_singleton() {
static std::shared_ptr<Singleton> singleton = std::make_shared<Singleton>();
static thread_local std::shared_ptr<Singleton> local = singleton;
return *local;
}
поэтому, когда основной поток выходит и берет с собой singleton
, каждый поток по-прежнему имеет свой собственный local
shared_ptr
, который поддерживает один Singleton
в живых.