在Linux qt 4.7.4下使用gcc 4.4.3 以下代码编译良好,不会给出运行时错误。
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();
}
答案 0 :(得分:2)
我终于找到了主要的区别。当QReadWritelock声明为Recursive时,来自一个线程的Readlock仅计为一个锁。因此,在同一个线程中读取的连续锁定不会被等待写入锁定阻止。当锁被声明为非递归时,这可能会发生并导致非常糟糕的死锁。
答案 1 :(得分:0)
我想QReadWriteLock::NonRecursive
模式只影响写锁。
尝试从同一个线程中以非递归模式获取写锁两次,我想你会得到你期望的行为。