mordorwww 发表于 2014-04-28 17:06

用户态有没有读写锁

用户态有没有读写锁

Tinnal 发表于 2014-04-28 23:39

1. 初始化和销毁:
#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
成功则返回0, 出错则返回错误编号.
同互斥量以上, 在释放读写锁占用的内存之前, 需要先通过pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.
2. 读和写:
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
成功则返回0, 出错则返回错误编号.
这3个函数分别实现获取读锁, 获取写锁和释放锁的操作. 获取锁的两个函数是阻塞操作, 同样, 非阻塞的函数为:
#include <pthread.h>
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
成功则返回0, 出错则返回错误编号.
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY.


详情自己看man手册:http://linux.die.net/man/3/pthread_rwlock_init

瀚海书香 发表于 2014-04-29 09:56

回复 2# Tinnal
回复的很详细啊,赞一个!:mrgreen:

   

gaojl0728 发表于 2014-04-30 10:55

trylock不阻塞,貌似很好用, 但是也带来了新的问题, 应为调用trylock的线程不会等待, 所以另一个线程释放锁的时候内核并不会通知trylock的线程锁已经释放, 没有了这一层的同步语义,会导致潜在的线程饥饿问题,这种问题极难定位。


所以不建议使用trylock,尽量只用lock.

kkddkkdd11 发表于 2014-04-30 11:34

gaojl0728 发表于 2014-04-30 10:55 static/image/common/back.gif
trylock不阻塞,貌似很好用, 但是也带来了新的问题, 应为调用trylock的线程不会等待, 所以另一个线程释放 ...

支持这种说法,最好只用互斥锁:)

mordorwww 发表于 2014-05-01 07:31

gaojl0728 发表于 2014-04-30 10:55 static/image/common/back.gif
trylock不阻塞,貌似很好用, 但是也带来了新的问题, 应为调用trylock的线程不会等待, 所以另一个线程释放 ...

trylock应该是用在轮询里的吧,本来就是异步的
她的本来目的就是不希望阻塞当前线程,如果锁了,我就选择干别的去,别的干完了再来看锁打开没,还没打开我还去干别的去
页: [1]
查看完整版本: 用户态有没有读写锁