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 中多次解锁,如果注释掉一个解锁,则以下代码永远不会打印“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 被声明为递归时,来自一个线程的 Readlock 只算作一个锁。因此,在同一线程中连续读取的锁不会被等待的写入锁阻塞。当锁被声明为非递归时,这可能会发生并导致非常糟糕的死锁。

于 2012-02-12T00:46:49.250 回答
0

我猜该QReadWriteLock::NonRecursive模式只影响写锁。

尝试从同一个线程两次以非递归模式获取写锁,我认为你会得到你期望的行为。

于 2012-02-03T08:36:57.327 回答