[pthread]读写锁

pthread_rwlock_t 结构体的定义:

struct {
     int __lock;
     unsigned int __nr_readers;  
     unsigned int __readers_wakeup;
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
     /* FLAGS must stay at this position in the structure to maintain binary compatibility.  */
     unsigned char __flags;
     unsigned char __shared;
     unsigned char __pad1;
     unsigned char __pad2;
     int __writer;
} __data;
说明
  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,自己是无法获取读锁的,防止线程饥饿。
  4. 如果获取了一次读锁,但是却错误的调用了两次pthread_rwlock_unlock(),会出现什么情况呢?自己在ubuntu上试了一下,__nr_readers变成了一个很大的数[0-1],造成以后的写锁可能再也获取不了。
  5. 如果自己已经获取了写锁,再去加读锁,pthread_rwlock_wrlock()是会返回出错的; 如果自己已经获取了读锁,再去加写锁,会出现死锁的。

你可能感兴趣的:(多线程)