读写锁与互斥锁类似,读写锁允许更高的并行性。
它有三种状态:读情况下枷锁,写情况加锁,不加锁
读写锁适用于读 *** 作多于写 *** 作的情况,例如网页的查询数据库等 *** 作。
写模式:当读写锁在写模式下时,它所保护的数据结构就可以被安全地修改,因为当前只有一个线程可以在写模式下拥有这个锁。
读模式:当读写锁在读模式下时,只要线程获取了读模式下的读写锁,该锁所保护的数据结构可以被多个获得读模式锁的线程读取。
读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。
(1) 如果某线程申请了读锁,其他线程可以再申请读锁,但不能申请写锁 (2) 如果某线程申请了写锁,则其他线程不能在申请读锁也不能申请写锁
pthread_rwlock_t rwlock; //全局变量 读写锁初始化方式 静态分配的读写锁:把常量PTHREAD_COND_INITIALIZER赋给静态分配的读写锁,属性为NULL 动态分配的读写锁:使用pthread_cond_init函数进行初始化 区别在于:静态初始化不执行错误检查,使用默认属性初始化读写锁 int pthread_rwlock_init (pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); rwlock 指向要初始化的读写锁的指针 attr 指向属性对象的指针,该属性对象定义要初始化的读写锁的特性 返回值:成功返回0,否则返回错误编号以指明错误 申请读锁 int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock); 以阻塞方式申请读锁 返回值:成功返回0,否则返回错误编号以指明错误 其他:如果不能申请到该读锁,pthread_rwlock_rdlock将阻塞当前进程 int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock); 说明:以非阻塞方式申请读锁 返回值:成功返回0,否则返回错误编号以指明错误 其他:如果不能申请到该读锁,pthread_rwlock_tryrdlock将返回错误 申请写锁 int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock); 以阻塞方式申请写锁 返回值:成功返回0,否则返回错误编号以指明错误 其他:如果不能申请到该写锁,pthread_rwlock_wrlock将阻塞当前进程 int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock); 以非阻塞方式申请写锁 返回值:成功返回0,否则返回错误编号以指明错误 其他:如果不能申请到该写锁,pthread_rwlock_trywrlock将返回错误 解锁 int pthread_rwlock_unlock (pthread_rwlock_t *rwlock); 如果无论是读锁还是写锁,都使用该函数来释放锁 返回值:成功返回0,否则返回错误编号以指明错误 其他: (1) 如果调用该函数来释放读锁,但当前还有其他读锁定,则保持读锁定状态,只不过当前线程已不再是其所有者之一 如果释放最后一个读锁,则读写锁将处于解锁状态 (2) 如果调用此函数释放写锁,则置读写锁为解锁状态 int pthread_rwlock_destroy (pthread_rwlock_t *rwlock); 返回值:成功返回0,否则返回一个错误编号以指明错误
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)