Chinaunix首页 | 论坛 | 博客
  • 博客访问: 584585
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-02-24 12:24:00

头文件
#include

方法
int pthread_rwlock_init ( pthread_rwlock_t *restrict rwlock , 
                    const pthread_rwlockattr_t *restrict attr ) ;

int pthread_rwlock_destory ( pthread_rwlock_t *rwlock ) ;

方法执行正确,则返回数值为 0 
执行错误,返回非零数值在对应系统中,可根据错误码来根据宏定义找出出错原因。
读写锁与互斥量的功能基本一致,不过前者在并发控制的时候可以 允许更大数量的线程的并发执行。

对于读写锁中有读模式(read-mode)和写模式(write-mode),当一个线程申请到锁并为资源加上
读锁之后,其余因为没有申请到锁的线程会被归入到该锁的阻塞队列中。此时阻塞队列中既有对资源
进行写操作的也有读操作的。因为占有锁的线程是以读模式申请的该锁,所以允许陷入阻塞队列中的
对资源执行读操作的线程可以访问被锁以读模式锁定的资源。----> 从某种角度上来说增加了并发度

当一个线程申请到锁并为需要保护的资源加上写锁之后,其余因为没有申请到锁的线程同样被归入到
该锁的阻塞队列中。但是由于占有该锁的线程是以写模式(write-mode)的方式,所以阻塞队列中的所
有线程均没有访问(读或写) 由写模式锁而保护的资源对象的权限。

所以中上述描述中,我们同样也可以知道的是,读锁+写锁 == > 读写锁 ; 写锁 == > 互斥量
同时,互斥量和读写锁中的写模式是 写锁 它为排它锁、独占锁; 读写锁中的读模式是 读锁 它为
共享锁。


读写锁的初始化

读写锁 pthread_rwlock_t 的初始化方法同互斥量变量 pthread_mutex_t 的初始化方法相类似,
分为静态初始化和动态初始化

其中静态初始化方法常常用在 pthread_rwlock_t 被设定为 static 静态变量或是 extern 全局变量的时候所使用,
因为静态变量与全局变量在编译的时候就已经被系统分配完毕,所以这些类型的变量空间并不是在程序运行的
时候动态分配的。无法通过调用相关方法来为其划分空间,只能够借助于宏定义实现的初始化手段来为其初始化。
该初始化方法,将会为创建出来的 pthread_rwlock_t 对象统一的进行赋值默认的数值。
其中,为其分配的空间来自于系统中的栈空间,在程序结束之后,栈空间会自动被系统所回收。

即 pthread_rwlock_t data = PTHREAD_RWLOCK_INITIALIZER ;

而动态初始化方法常常用在 pthread_rwlock_t 变量在系统中的空间是动态划分的,也就是系统通过malloc,realloc,
在堆空间中为变量划分空间。我们都知道:从堆中申请的空间,在程序结束之后是不会被系统自动回收的,是通过
使用 pthread_rwlock_destory 方法手动的将空间进行释放

即 pthread_rwlock_t data  ;
   pthread_rwlock_init ( &data , NULL ) ;
方法中的第二个参数是用来为传入的指向 pthread_rwlock_t 变量 data 的各个字段赋值特定数值的,如果传入的对象
是 NULL, 那么就将 data 对象初始化为默认的 pthread_rwlock_t 类型。
在程序退出的时候,需要通过方法 
  int pthread_rwlock_destory ( pthread_rwlock_t * ) ;
来回收系统为变量 data 分配的空间 , 即    pthread_rwlock_destory ( &data ) ;


点击(此处)折叠或打开

  1. #include <pthread.h>


  2. int main ( int argc , char *argv [] )
  3. {
  4.     pthread_rwlock_t data1 , data2 ;

  5.     data1 = PTHREAD_RWLOCK_INITIALIZER ;
  6.     if ( pthread_rwlock_init ( &data2 ) )
  7.     {
  8.         printf ( " something wrong when initial \n") ;
  9.         return 0 ;
  10.     }
  11.     if ( pthread_rwlock_destory ( &data2 ) )
  12.     {
  13.         printf (" something wrong when destory \n") ;
  14.         return 0 ;
  15.     }
  16.     
  17.     return 0 ;
  18. }
end 
阅读(3033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~