我在自己的项目中使用了线程安全的QObject单例,我想知道我是否正确使用QtConcurrent创建它们而不是QMutex' es和QThread' s
以下是我如何设法编写单例代码。
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;
}
};
或者,还有其他更好的方法吗?
谢谢。
注意:我分别处理共享实例销毁。
编辑:我希望共享实例位于主线程中。
答案 0 :(得分:0)
这两段代码做了很多不同的事情。第一个在工作线程中构造新实例,然后将其移动到主线程。这是在调用线程阻塞以创建新实例时完成的。我不知道你为什么要这样做,因为除了并发症之外你什么也买不到。调用线程阻塞不小于在调用线程中构造实例的情况。它也与单例无关:sharedInstance
将在每次调用时返回一个新实例。
第二个构造实例,无论从哪个线程首次访问sharedInstance
。你需要告诉我们你的意思是什么?&#34;线程安全的单身人士&#34;。由于QObject
只能从一个且仅一个线程直接访问,因此我不太明白为什么您需要一个线程安全的单例QObject
。
无论如何,第二种变体只是重新发明Q_GLOBAL_STATIC
,似乎没有任何理由。