pthread_rwlock_t读写锁常用的函数
Tables | Are |
---|---|
初始化读写锁 | pthread_rwlock_init |
读取读写锁中的锁 | pthread_rwlock_rdlock |
读取非阻塞读写锁中的锁 | pthread_rwlock_tryrdlock |
写入读写锁中的锁 | pthread_rwlock_wrlockt |
写入非阻塞读写锁中的锁 | pthread_rwlock_unlock |
销毁读写锁 | pthread_rwlock_destroy |
pthread_rwlock_t读写锁的结构体
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
pthread_rwlock_t读写锁注意的地方(参考)
那这四个字段,那当我们线程加锁时,是怎么反应并记录到这个结构体中的呢?
1. 当我们使用pthread_rwlock_rdlock()获取一次读锁时,__nr_readers字段就会加一,注意,就算是同一个线程,在已经获得读锁的情况下,再去获取读锁,__nr_readers字段仍然会加一的,当我们调用pthread_rwlock_unlock()一次时,__nr_readers就会减一,如果我们重复加了读锁,必须重复调用pthread_rwlock_unlock()来使__nr_readers减一,否则其他线程再想获取写锁时,是会阻塞的。
2.__writer记录此时是谁占用着写锁,每一个线程都会有用同的ID号表示。
3.__nr_readers_queued 和 __nr_writers_queued字段表示有多少线程正等待加锁。这里有一点值得注意的地方就是,当想要获取读锁,但是发现__nr_writers_queued字段不为0,可就是有别的线程在等待获取写锁时,且该线程的优先级高于或想同于自己的优先级时,自己是无法或许读锁的,即使当前pthread_rwlock_t只是被加了读锁,但是有高优先级的线程已经在等待加写锁,自己仍然阻塞,为什么要这样呢?如果不这样,那读锁就会很有可能被一直占着,想加写锁的被饿死的情况。
4. 如果自己已经获取了一次读锁,但是却错误的调用了两次pthread_rwlock_unlock(),会出现什么情况呢?自己在ubuntu上试了一下,__nr_readers变成了一个很大的数,也就是0又减一了,造成以后的写锁可能再也获取不了了!
5. 如果自己已经获取了写锁,再去加读锁,pthread_rwlock_rdlock()是会返回出错的。
6. 如果自己已经获取了读锁,再去加写锁,会出现死锁的。