linux 读写锁(写优先)使用方法

http://sourceware.org/ml/glibc-bugs/2008-11/msg00073.html

http://www.nabble.com/-Bug-nptl-7057--New:-pthread-rwlock-does-not-implement-'writer-preferred'-option-td20703744.html

 

pthread rwlock does not implement 'writer preferred' option

 

 

linux 读写锁

定义(全局变量):
pthread_rwlock_t    rw_lock;


初始化:
{
    pthread_rwlockattr_t attr;
    int ret = 0;

    ret = pthread_rwlockattr_init( &attr );
    if( ret < 0 )
    {
 ...;
        return;
    }

#ifdef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP
    pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP); // 写优先
#endif

    ret = pthread_rwlockattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );  // 进程内
    if( ret < 0 )
    {
        ...;
        return;
    }

    ret = pthread_rwlock_init( &rw_lock, &attr );
    if( ret < 0 )
    {
        ...;
        return;
    }


    ret = pthread_rwlockattr_destroy( &attr );
    if( ret < 0 )
    {
        ...;
        return;
    }

    return;
}

 

使用:
    // 写锁
    pthread_rwlock_wrlock(&rw_lock);
    ......
    pthread_rwlock_unlock(&rw_lock);

    // 读锁
    pthread_rwlock_rdlock(& w_lock);
    ......
    pthread_rwlock_unlock(&rw_lock);

 

 

另外一个:

  #define   _XOPEN_SOURCE   500   
      #include   <pthread.h>   
      #   define   PTHREAD_RWLOCK_INITIALIZER_READ_PREF       {   {0,   0},   0,   NULL,   NULL,   NULL,                                         PTHREAD_RWLOCK_PREFER_READER_NP,   PTHREAD_PROCESS_PRIVATE   }  
   
  static   pthread_rwlock_t   a   =   PTHREAD_RWLOCK_INITIALIZER;  
   
  void   *route_3   (void   *p)  
  {  
                  sleep(2);  
                  printf("locking   3   =   %d/n",   pthread_rwlock_rdlock(&a));  
                  pause();  
                  return   NULL;  
  }  
   
  void   *route_2   (void   *p)  
  {  
                  sleep(1);  
                  printf("locking   2   =   %d/n",   pthread_rwlock_wrlock(&a));  
                  pause();  
                  return   NULL;  
  }  
   
  void   *route_1   (void   *p)  
  {  
                  printf("locking   1   =   %d/n",   pthread_rwlock_rdlock(&a));  
                  pause();  
                  return   NULL;  
  }  
   
  main()  
  {  
                  pthread_t   t1,   t2,   t3;  
                  pthread_create(&t1,   NULL,   route_1,   NULL);  
                  pthread_create(&t2,   NULL,   route_2,   NULL);  
                  pthread_create(&t3,   NULL,   route_3,   NULL);  
                  pthread_join(t1,   NULL);  
                  pthread_join(t2,   NULL);  
                  pthread_join(t3,   NULL);  
  }  
   
  这个例子如果把a初始化成PTHREAD_RWLOCK_INITIALIZER_READ_PREF   ,才是读优先的,你可以试一下,如果不对,就只有怀疑线程库看源码了。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值