Skip to content

Latest commit

 

History

History
68 lines (49 loc) · 1.66 KB

读写锁.md

File metadata and controls

68 lines (49 loc) · 1.66 KB

读写锁

读并行,写串行的锁。

读写锁类型

#include <pthread.h>
pthread_rwlock_t lock;

主要函数

  • 初始化读写锁
#include <pthread.h>
int pthread_rwlock_init(
	pthread_rwlock_t *restrict rwlock,			// 锁的地址
	const pthread_rwlockattr_t *restrict attr	// 常为NULL
);
  • 销毁读写锁
#include <pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
  • 加读锁或尝试加读锁
#include <pthread.h>

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);		// 若之前这把锁已经有加写锁操作,阻塞住
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);		// 加锁成功返回0,失败返回错误
  • 加写锁或尝试加写锁
#include <pthread.h>

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 	// 上一次加写锁,还未解锁时会阻塞。上一次加读锁,读锁未解锁时也会阻塞。
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);	// 
  • 解锁
#include <pthread.h>

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

读写锁的性质

  • 读写锁的类型
    • 读锁: 对内存做读操作
    • 写锁: 对内存做写操作
  • 读写锁的特性
    • 线程a加读锁成功,又来了3个线程做读操作。可以成功加读锁。 读共享数据可以并行处理
    • 线程a加写锁成功,又来了3个线程做读操作。此时三个线程阻塞。 写锁独占
  • 线程a加读锁成功,又来了线程b加写锁阻塞。又来c线程加读锁也阻塞。
    • 读写不能同时。
    • 写优先级高。(如果a读锁释放了,b先获得写锁,哪怕bc同时申请)

程序中的读操作多于写操作时用到读写锁。