0

我在自己的项目中使用线程安全的 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;
         }
 };

或者,还有其他更好的方法吗?

谢谢你。

注意:我正在单独处理共享实例销毁。

编辑:我希望共享实例位于主线程中。

4

1 回答 1

0

这两段代码做了非常不同的事情。第一个在工作线程中构造新实例,然后将其移至主线程。这是在调用线程阻塞要创建的新实例时完成的。我不知道你为什么要这样做,因为除了复杂性之外,它绝对不会给你带来任何好处。如果您在调用线程中构造了实例,调用线程就会阻塞。它也与单例无关:sharedInstance每次调用都会返回一个新实例。

第二个在第一次访问的线程中构造实例sharedInstance。您需要告诉我们“线程安全单例”是什么意思。由于QObject只能从一个且只有一个线程直接访问,我不太明白为什么需要线程安全的单例QObject

无论如何,第二个变体Q_GLOBAL_STATIC似乎根本没有理由重新发明。

于 2014-06-07T03:12:41.177 回答