1

gcc 4.4.3 を使用する Linux qt 4.7.4 では、次のコードは正常にコンパイルされ、実行時エラーは発生しません。

class TestThread: public QThread {
  private:
      QReadWriteLock mutex;

  public:
    bool mStop;

    TestThread(): mutex(QReadWriteLock::NonRecursive),mStop(false) {}
    void run() {
      while(!mStop) {
        mutex.lockForRead();        
        qDebug() << "Tread running";
        msleep(100);        
      }
    }
};

ロックは同じスレッドによって数回ロックされ、何も起こりません。マニュアルによるとhttp://doc.qt.io/archives/qt-4.7/qreadwritelock.html

ロックは、同じスレッドによって一度だけロック可能であるべきです。これは重大なバグですか、それともマニュアルを誤解していますか?

Chris への返信: ロックは NonRecursive でも数回ロック解除する必要があります。1 つのロック解除がコメント アウトされている場合、次のコードは "Writing" を出力しません。

class TestThread: public QThread {
  private:
    QReadWriteLock mutex;

  public:
    TestThread(): mutex(QReadWriteLock::NonRecursive){}
    void run() {
        mutex.lockForRead();
        mutex.lockForRead();
        qDebug() << "Tread running";
        //mutex.unlock();
        mutex.unlock();
        mutex.lockForWrite();
        qDebug() << "Writing";
        mutex.unlock();
        msleep(50);
    }
};


int main(int argc, char *argv[]) {
  TestThread myThread;

  myThread.start();
  usleep(500000);
  myThread.terminate();
}
4

2 に答える 2

2

私はついに主な違いを見つけました。QReadWritelock が Recursive として宣言されている場合、1 つのスレッドからの Readlock は 1 つのロックとしてカウントされます。したがって、同じスレッドでの連続した読み取りロックは、待機中の書き込みロックによってブロックされることはありません。ロックが非再帰的であると宣言されると、これが発生し、非常に悪いデッドロックが発生する可能性があります。

于 2012-02-12T00:46:49.250 に答える
0

QReadWriteLock::NonRecursiveモードは書き込みロックにのみ影響すると思います。

同じスレッドから非再帰モードで書き込みロックを 2 回取得してみてください。期待どおりの動作が得られると思います。

于 2012-02-03T08:36:57.327 に答える