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      
      #   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   ,才是读优先的,你可以试一下,如果不对,就只有怀疑线程库看源码了。  

你可能感兴趣的:(linux 读写锁(写优先)使用方法)