读写锁: 读锁(共享锁) —> 访问临界资源,可以一起读取数据 --> 读锁可以同时上,不会阻塞!
写锁(互斥锁) —> 访问临界资源时,不要一起修改值 --> 写锁不能同时上锁,会阻塞!
1. 初始化读写锁 – pthread_rwlock_init() -> man 3
pthread_rwlock_init
#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);rwlock: 读写锁的地址 attr: 锁属性,普通属性: NULL
返回值: 成功: 0 失败: 错误码
2. 读锁上锁(多个线程可以同时上锁) – pthread_rwlock_rdlock()
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
rwlock: 已经初始化过的锁的变量地址
返回值: 成功: 0 失败: 错误码
3. 写锁上锁(写锁不能同时上锁) — pthread_rwlock_wrlock()
#include <pthread.h>
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
rwlock: 已经初始化过的锁的变量地址
返回值: 成功: 0 失败: 错误码
4. 读写锁解锁 — pthread_rwlock_unlock()
#include <pthread.h>
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
rwlock: 已经初始化过的锁的变量地址,正在上锁的状态
返回值: 成功: 0 失败: 错误码
5. 销毁读写锁 — pthread_rwlock_destroy()
#include <pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
rwlock: 已经初始化过的锁的变量地址
返回值: 成功: 0 失败: 错误码
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int num = 0; //临界资源
pthread_rwlock_t rwlock;
void *routine1(void *arg)
{
//3. 一旦写锁上锁,别的线程就不能够写锁上锁
pthread_rwlock_wrlock(&rwlock