Qt、QMutexはどのように機能しますか?それは動作していないようだ

私のコードは以下の通り:

int main(int argc, char* argv[])
{
    MyThread myThread1;
    MyThread myThread2;
    myThread1.start();
    myThread2.start();

    qDebug("Hello World");

    myThread1.wait();
    qDebug("myThread1 is finished...");
    myThread2.wait();
    qDebug("myThread2 is finished...");

    return 0;
}

>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void run();
};

>

void MyThread::run()
{
    QMutex mutex();
    int x = 10000;
    mutex.lock();

    while(x != 0) {
        sleep(1);
        qDebug("%d, x = %d ", thread()->currentThreadId(), x);
        x--;
    }

    mutex.unlock();
}

結果は次のとおりです:

Hello World
5516, x = 10000 
6060, x = 10000 
5516, x = 9999 
6060, x = 9999 
5516, x = 9998 
6060, x = 9998 
5516, x = 9997 
6060, x = 9997
...
...

私は結果が欲しいです:

xxxx: 10000 
xxxx:  9999 
xxxx:  9998 
xxxx:  9997 
... 
... 
xxxx:     1

yyyy: 10000 
yyyy:  9999 
... 
...  
yyyy:     1

why? where is my fault ? And how to use QMutex.. Thank you ...

0
まだ...スレッド1が完了したときにのみスレッド2を開始したいですか?もしそうなら、なぜ2つのスレッドがありますか?あなたのコードでは正しくないことがたくさんありますが、あなたが何をしようとしているのか分かりません。ほんの少し説明してください。
追加された 著者 UmNyobe,
タスクを順番に実行したいとき、スレッドのポイントは何ですか?
追加された 著者 bummzack,
私はコードを更新しました..ありがとう...
追加された 著者 Mr.Tu,
実際には、QMutex..o(∩_∩)を使う方法を知りたいだけです。
追加された 著者 Mr.Tu,

3 答え

実行呼び出しの範囲内でミューテックスを作成しています。ミューテックスがスレッド2の実行を停止/遅延させたい場合は、オブジェクトが毎回独自のミューテックスを作成しないように宣言する必要があります。

// .h
class MyThread {
   ...
private:
 static QMutex mutex;
}


// .cpp
QMutex MyThread::mutex; 



// .cpp
void MyThread::run()
{
  QMutexLocker lock(&mutex)

 //do stuff then return 
 //and the mutex will be unlocked when 
 //you leave this scope
}
4
追加された
ありがとうございます...あなたの助言によると、私はそれを解決し、
追加された 著者 Mr.Tu,

ミューテックスオブジェクトはローカルオブジェクトです。したがって、スレッドは異なるミューテックスを使用しており、ロックしているスレッドは他のミューテックスに影響を与えません。

これを修正するには、 QMutex オブジェクトを両方のスレッドがアクセスできる場所に移動します。たとえば、グローバル変数にします。

また、 lock() unlock()を明示的に呼び出す代わりに、関数内でRAII形式の QMutexLocker を使用する方が簡単です。

1
追加された
あなたの答えをありがとう、私はそれを解決するhava ..
追加された 著者 Mr.Tu,

開発者の説明はこちらをご覧ください。

これはロックフリーのプログラミングであり、再実装が非常に難しく、デバッグや検証がさらに難しいです。

しかし、Linuxプラットフォームで使用する QMutex のLinux futexes を指しています。
移植性が問題でない場合は、これを使用することもできます。

これはあなたの質問ラベルに答えます。

しかし、あなたの特別なケースでは、あなたは本当にそれを必要としません。すべてのワーカースレッドが共有するグローバルミューテックスを作成するだけです。

0
追加された