linux 读写锁(写优先)使用方法
http://sourceware.org/ml/glibc-bugs/2008-11/msg00073.htmlhttp://www.nabble.com/-Bug-nptl-7057--New:-pthread-rwlock-does-not-implement-writer-preferred-option-td20703744.html pthread rwlock doe
http://sourceware.org/ml/glibc-bugs/2008-11/msg00073.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)