天天看点

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

继续阅读