加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:线程同步之读写锁及属性

发布时间:2016-08-01 18:21:11 所属栏目:Unix 来源:站长网
导读:读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个
副标题[/!--empirenews.page--]

读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互斥量要么是锁住状态要么是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有三种状态:读模式下的加锁状态,写模式下的加锁状态,不加锁状态。

一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。

当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁(读或写)的线程都会被阻塞。

当读写锁在读加锁状态时,所有试图以读模式对它加锁的线程都可以得到访问权,但是如果线程希望以写模式对此锁进行加锁,它必须阻塞直到所有的线程释放读锁。

当读写锁在读加锁状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求。(后面有代码验证发现ubuntu 10.04系统下,不会阻塞随后的读模式的请求,最终导致请求写锁的线程饿死状态)这样可以避免读模式锁长期占有,而等待的写模式锁请求一直得不到满足,出现饿死情况。后面会测试ubuntu 10.04系统的情况。(注意前篇关于记录锁fcntl中,ubuntu 10.04系统下,进程拥有读锁,然后优先处理后面的读锁,再处理写锁,导致写锁出现饿死)

读写锁也称为共享-独占(shared-exclusive)锁,当读写锁以读模式加锁时,它是以共享模式锁住,当以写模式加锁时,它是以独占模式锁住。读写锁非常适合读数据的频率远大于写数据的频率从的应用中。这样可以在任何时刻运行多个读线程并发的执行,给程序带来了更高的并发度。

需要提到的是:读写锁到目前为止仍然不是属于POSIX标准。

1读写锁的初始化和销毁

#include <pthread.h>  
int pthread_rwlock_init (pthread_rwlock_t *rwlock,const pthread_rwlockattr_t *attr);  
      
int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);  
      
                                               返回值:成功返回0,否则返回错误代码

与互斥量一样,读写锁在使用之前必须初始化,在释放它们底层的内存前必须销毁。

上面两个函数分别由于读写锁的初始化和销毁。和互斥量,条件变量一样,如果读写锁是静态分配的,可以通过常量进行初始化,如下:

<span style="font-size:14px;">pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;</span>  

也可以通过pthread_rwlock_init()进行初始化。对于动态分配的读写锁由于不能直接赋值进行初始化,只能通过这种方式进行初始化。pthread_rwlock_init()第二个参数是读写锁的属性,如果采用默认属性,可以传入空指针NULL。

那么当不在需要使用时及释放(自动或者手动)读写锁占用的内存之前,需要调用pthread_rwlock_destroy()进行销毁读写锁占用的资源。

2读写锁的使用

/* 读模式下加锁  */
int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);  
      
/* 非阻塞的读模式下加锁  */
int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);  
      
/*  限时等待的读模式加锁 */
int pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,const struct timespec *abstime);  
      
      
/* 写模式下加锁  */
int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);  
      
/* 非阻塞的写模式下加锁 */
int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);  
      
/* 限时等待的写模式加锁 */
int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,const struct timespec *abstime);  
      
/* 解锁 */
int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);  
      
                                                   返回值:成功返回0,否则返回错误代码

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读