0

私は自分のプロジェクトでスレッドセーフな QObject シングルトンを使用していますが、QMutex や QThread ではなく QtConcurrent を使用してそれらを作成するのが正しいかどうか疑問に思っていました。

シングルトンコードを書く方法は次のとおりです。

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

2 つのコードは、非常に異なることを行います。最初のものは、ワーカー スレッドで新しいインスタンスを構築し、それをメイン スレッドに移動します。これは、呼び出し元のスレッドが新しいインスタンスの作成をブロックしている間に行われます。複雑さ以外に何も買わないので、なぜそれをするのかわかりません。呼び出しスレッドは、呼び出しスレッドでインスタンスを構築した場合と同様にブロックされます。また、シングルトンとは何の関係もありませんsharedInstance。呼び出しごとに新しいインスタンスが返されます。

2番目のものは、最初にアクセスsharedInstanceしたスレッドでインスタンスを構築します。「スレッドセーフなシングルトン」の意味を教えてください。1 つのスレッドからのみ直接アクセスできるためQObject、スレッドセーフな singleton が必要な理由がよくわかりませんQObject

とにかく、2 番目のバリアントは、Q_GLOBAL_STATICまったく理由がないように見えるだけで再発明しています。

于 2014-06-07T03:12:41.177 に答える