使用QtConcurrent作为单身人士

时间:2014-06-06 15:30:17

标签: c++ qt c++11 singleton qtconcurrent

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

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

谢谢。

注意:我分别处理共享实例销毁。

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

1 个答案:

答案 0 :(得分:0)

这两段代码做了很多不同的事情。第一个在工作线程中构造新实例,然后将其移动到主线程。这是在调用线程阻塞以创建新实例时完成的。我不知道你为什么要这样做,因为除了并发症之外你什么也买不到。调用线程阻塞不小于在调用线程中构造实例的情况。它也与单例无关:sharedInstance将在每次调用时返回一个新实例。

第二个构造实例,无论从哪个线程首次访问sharedInstance。你需要告诉我们你的意思是什么?&#34;线程安全的单身人士&#34;。由于QObject只能从一个且仅一个线程直接访问,因此我不太明白为什么您需要一个线程安全的单例QObject

无论如何,第二种变体只是重新发明Q_GLOBAL_STATIC,似乎没有任何理由。