#include<iostream>
#include<string>
#include<thread>
#include<mutex>
class ThreadWrapper
{
ThreadWrapper()
{
start();
}
void start()
{
//init SDL here
_thread = std::thread([&]() { run(); });
}
void stop()
{
//signal thread to stop
_thread.join();
//you can deinit SDL here
}
public:
~ThreadWrapper()
{
stop();
}
static auto& instance()
{
std::lock_guard<std::mutex> lock(_instance_mutex);
if (!_instance)
_instance.reset(new ThreadWrapper);
return *_instance;
}
static void initialize()
{
instance();
}
static void deinitialize()
{
std::lock_guard<std::mutex> lock(_instance_mutex);
_instance.reset();
}
protected:
void run()
{
}
std::thread _thread;
static std::unique_ptr<ThreadWrapper> _instance;
static std::mutex _instance_mutex;
};
std::unique_ptr<ThreadWrapper> ThreadWrapper::_instance;
std::mutex ThreadWrapper::_instance_mutex;
int main()
{
ThreadWrapper::initialize();
ThreadWrapper::deinitialize();
ThreadWrapper::deinitialize();
ThreadWrapper::initialize();
ThreadWrapper::deinitialize();
ThreadWrapper::deinitialize();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8dGhyZWFkPgojaW5jbHVkZTxtdXRleD4KCmNsYXNzIFRocmVhZFdyYXBwZXIKewoJVGhyZWFkV3JhcHBlcigpCgl7CgkJc3RhcnQoKTsKCX0KCgoJdm9pZCBzdGFydCgpCgl7CQkKCQkvL2luaXQgU0RMIGhlcmUKCgkJX3RocmVhZCA9IHN0ZDo6dGhyZWFkKFsmXSgpIHsgcnVuKCk7IH0pOwoJfQoKCXZvaWQgc3RvcCgpCgl7CgoJCS8vc2lnbmFsIHRocmVhZCB0byBzdG9wCgoJCV90aHJlYWQuam9pbigpOwoKCQkvL3lvdSBjYW4gZGVpbml0IFNETCBoZXJlCgl9CnB1YmxpYzoKCX5UaHJlYWRXcmFwcGVyKCkKCXsKCQlzdG9wKCk7Cgl9CgoKCXN0YXRpYyBhdXRvJiBpbnN0YW5jZSgpCgl7CgkJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX2luc3RhbmNlX211dGV4KTsKCQlpZiAoIV9pbnN0YW5jZSkKCQkJX2luc3RhbmNlLnJlc2V0KG5ldyBUaHJlYWRXcmFwcGVyKTsKCQlyZXR1cm4gKl9pbnN0YW5jZTsKCX0KCglzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKCXsKCQlpbnN0YW5jZSgpOwoJfQoJc3RhdGljIHZvaWQgZGVpbml0aWFsaXplKCkKCXsKCQlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfaW5zdGFuY2VfbXV0ZXgpOwoJCV9pbnN0YW5jZS5yZXNldCgpOwoJfQoKcHJvdGVjdGVkOgoJdm9pZCBydW4oKQoJewoJCQoJfQoKCXN0ZDo6dGhyZWFkIF90aHJlYWQ7CgoJc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUaHJlYWRXcmFwcGVyPiBfaW5zdGFuY2U7CglzdGF0aWMgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZV9tdXRleDsKfTsKCnN0ZDo6dW5pcXVlX3B0cjxUaHJlYWRXcmFwcGVyPiBUaHJlYWRXcmFwcGVyOjpfaW5zdGFuY2U7CnN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgICAgICBUaHJlYWRXcmFwcGVyOjpfaW5zdGFuY2VfbXV0ZXg7CgppbnQgbWFpbigpCnsKCVRocmVhZFdyYXBwZXI6OmluaXRpYWxpemUoKTsKCVRocmVhZFdyYXBwZXI6OmRlaW5pdGlhbGl6ZSgpOwoJVGhyZWFkV3JhcHBlcjo6ZGVpbml0aWFsaXplKCk7CgoJVGhyZWFkV3JhcHBlcjo6aW5pdGlhbGl6ZSgpOwoJVGhyZWFkV3JhcHBlcjo6ZGVpbml0aWFsaXplKCk7CgoKCglUaHJlYWRXcmFwcGVyOjpkZWluaXRpYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cgo=