QReadWriteLock Class Reference

[QtCore module]

该QReadWriteLock类提供的读写锁。More…

Types

  • enum RecursionMode { NonRecursive, Recursive }

Methods

  • __init__ (self)
  • __init__ (self, RecursionMode recursionMode)
  • lockForRead (self)
  • lockForWrite (self)
  • bool tryLockForRead (self)
  • bool tryLockForRead (self, int timeout)
  • bool tryLockForWrite (self)
  • bool tryLockForWrite (self, int timeout)
  • unlock (self)

Detailed Description

该QReadWriteLock类提供的读写锁。

读写锁是一个同步工具,用于保护可用于读取和写入访问的资源。如果你想允许多个线程同时有只读访问这个类型的锁是有用的,但只要有一个线程要写入的资源,所有其它线程必须被阻止,直到写入完成。

在许多情况下, QReadWriteLock是一个直接竞争者QMutex。 QReadWriteLock是一个不错的选择,如果有许多并发读取和写入发生很少。

例如:

  1. QReadWriteLock lock;
  2. void ReaderThread.run()
  3. {
  4. ...
  5. lock.lockForRead();
  6. read_file();
  7. lock.unlock();
  8. ...
  9. }
  10. void WriterThread.run()
  11. {
  12. ...
  13. lock.lockForWrite();
  14. write_file();
  15. lock.unlock();
  16. ...
  17. }

以确保作家不是由读者永远阻塞,读者试图获取锁不会如果有阻塞作家等待访问,即使锁定目前仅由其它读者访问成功。此外,如果该锁由一个作家访问和另一位作家进来,那笔者将优先于该也可能会等待任何读者。

喜欢QMutex,一个QReadWriteLock可以在构建时被递归锁定由同一个线程QReadWriteLock.RecursionMode。在这种情况下,unlock( )必须被调用的次数相同lockForWrite()或lockForRead( )被调用。需要注意的是试图以递归方式锁定,也就是说,它是不可能的读锁,在已经锁定写(反之亦然)一个线程,当锁定类型不能改变。


Type Documentation

  1. QReadWriteLock.RecursionMode
Constant Value Description
QReadWriteLock.Recursive 1 在这种模式下,一个线程可以锁定同一QReadWriteLock多次与互斥不会被解锁,直到相应数量的unlock( )的调用而制定的。
QReadWriteLock.NonRecursive 0 在这种模式下,一个线程可能仅锁定QReadWriteLock一次。

这个枚举被引入或修改的Qt 4.4 。

See also QReadWriteLock( ) 。


Method Documentation

  1. QReadWriteLock.__init__ (self)

构造一个QReadWriteLock在对象NonRecursive模式。

See also lockForRead()和lockForWrite( ) 。

  1. QReadWriteLock.__init__ (self, RecursionMode recursionMode)

构造一个QReadWriteLock在给定的对象recursionMode

此功能被引入Qt的4.4 。

See also lockForRead( )lockForWrite()和RecursionMode

  1. QReadWriteLock.lockForRead (self)

锁读锁。此函数将阻塞当前线程,如果任何线程(包括当前)已锁定用于写入。

See also unlock( )lockForWrite()和tryLockForRead( ) 。

  1. QReadWriteLock.lockForWrite (self)

锁写锁。此函数将阻塞当前线程,如果另一个线程已锁定读取或写入。

See also unlock( )lockForRead()和tryLockForWrite( ) 。

  1. bool QReadWriteLock.tryLockForRead (self)

尝试读锁。如果获得了锁,这个函数返回True ,否则返回,而不是等待该锁虚假变得可用,也就是说,它不会阻塞。

如果另一个线程已锁定用于写入的锁定尝试将会失败。

如果获得了锁,该锁必须被解锁unlock( )之前,另一个线程可以成功地将其锁定。

See also unlock()和lockForRead( ) 。

  1. bool QReadWriteLock.tryLockForRead (self, int timeout)

这是一个重载函数。

尝试读锁。如果获得了锁这个函数返回True,否则返回False 。如果另一个线程已锁定的文笔,这个函数将等待最多timeout毫秒为锁变得可用。

注意:传递一个负数作为timeout相当于调用lockForRead( ) ,即该函数将一直等待,直到锁可以锁定读数时timeout是负的。

如果获得了锁,该锁必须被解锁unlock( )之前,另一个线程可以成功地将其锁定。

See also unlock()和lockForRead( ) 。

  1. bool QReadWriteLock.tryLockForWrite (self)

尝试写锁。如果获得了锁,则该函数返回True,否则,它会立即返回False 。

如果另一个线程已锁定用于读取或写入锁定的尝试将会失败。

如果获得了锁,该锁必须被解锁unlock( )之前,另一个线程可以成功地将其锁定。

See also unlock()和lockForWrite( ) 。

  1. bool QReadWriteLock.tryLockForWrite (self, int timeout)

这是一个重载函数。

尝试写锁。如果获得了锁这个函数返回True,否则返回False 。如果另一个线程已锁定用于读取或写入时,此功能会等待最多timeout毫秒为锁变得可用。

注意:传递一个负数作为timeout相当于调用lockForWrite( ) ,即该函数将一直等待,直到锁可以锁定写入时timeout是负的。

如果获得了锁,该锁必须被解锁unlock( )之前,另一个线程可以成功地将其锁定。

See also unlock()和lockForWrite( ) 。

  1. QReadWriteLock.unlock (self)

解除锁定。

试图解锁未锁定的锁是一个错误,将导致程序终止。

See also lockForRead( )lockForWrite( )tryLockForRead()和tryLockForWrite( ) 。