C多线程开发补充2

C多线程开发补充2,第1张

C多线程开发补充2 读写

读写锁与互斥锁类似,读写锁允许更高的并行性。

它有三种状态:读情况下枷锁,写情况加锁,不加锁

读写锁适用于读 *** 作多于写 *** 作的情况,例如网页的查询数据库等 *** 作。

写模式:当读写锁在写模式下时,它所保护的数据结构就可以被安全地修改,因为当前只有一个线程可以在写模式下拥有这个锁。

读模式:当读写锁在读模式下时,只要线程获取了读模式下的读写锁,该锁所保护的数据结构可以被多个获得读模式锁的线程读取。

读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。

(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,否则返回一个错误编号以指明错误

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5713985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存