Я использую потокобезопасные синглтоны QObject в своем собственном проекте, и мне было интересно, правильно ли я поступаю, создавая их с использованием QtConcurrent, а не QMutex и QThread.
Вот как мне удается писать одноэлементный код.
class A : public QObject
{
Q_OBJECT
public:
A() {}
static A* sharedInstance() {
static QFuture<A*> helper = QtConcurrent::run([]() -> A* {
auto *instance = new A();
instance->moveToThread(qApp->thread());
return instance;
});
return (A*)helper;
}
};
Это лучше, чем следующее?
class A : public QObject
{
Q_OBJECT
public:
A() {}
static A* sharedInstance() {
static A* instance = 0;
static QMutex mtx;
mtx.lock();
if (!instance) {
instance = new A();
instance->moveToThread(qApp->thread());
}
mtx.unlock();
return instance;
}
};
Или есть ли другой лучший способ сделать это?
Спасибо.
ПРИМЕЧАНИЕ. Я обрабатываю уничтожение общего экземпляра отдельно.
EDIT: я хочу, чтобы общие экземпляры находились в основном потоке.