文章目录
- 1.读写锁的原理
- 2.提供的操作函数
- 示例代码
- 4.示例解释
1.读写锁的原理
读写锁(Read-Write Lock)是一种特殊的锁机制,用于在多线程环境下对共享资源进行读写操作。与互斥锁不同,读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。读写锁可以提高并发性能,适用于读操作比写操作频繁的场景。
2.提供的操作函数
在Linux系统编程中,读写锁的相关函数也是通过pthread库提供的。常用的读写锁相关函数有:
pthread_rwlock_init
函数的作用是初始化读写锁。- 原型:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
- 参数:
rwlock
:指向要初始化的读写锁变量的指针。attr
:指向读写锁属性的指针,通常设置为NULL
。
- 返回值:成功时返回0,失败时返回错误码。
- 原型:
pthread_rwlock_destroy
函数的作用是销毁读写锁。- 原型:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
- 参数:
rwlock
:指向要销毁的读写锁变量的指针。
- 返回值:成功时返回0,失败时返回错误码。
- 原型:
pthread_rwlock_rdlock
函数的作用是获取读锁。- 原型:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- 参数:
rwlock
:指向要获取读锁的读写锁变量的指针。
- 返回值:成功时返回0,失败时返回错误码。
- 原型:
pthread_rwlock_wrlock
函数的作用是获取写锁。- 原型:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
- 参数:
rwlock
:指向要获取写锁的读写锁变量的指针。
- 返回值:成功时返回0,失败时返回错误码。
- 原型:
pthread_rwlock_unlock
函数的作用是释放读锁或写锁。- 原型:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
- 参数:
rwlock
:指向要释放的读写锁变量的指针。
- 返回值:成功时返回0,失败时返回错误码。
- 原型:
示例代码
#include <stdio.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int shared_data = 0;
void* reader_func(void* arg) {
pthread_rwlock_rdlock(&rwlock);
printf("Reader %ld read shared data: %d\n", (long)arg, shared_data);
pthread_rwlock_unlock(&rwlock);
return NULL;
}
void* writer_func(void* arg) {
pthread_rwlock_wrlock(&rwlock);
shared_data += 1;
printf("Writer %ld wrote shared data: %d\n", (long)arg, shared_data);
pthread_rwlock_unlock(&rwlock);
return NULL;
}
int main() {
pthread_rwlock_init(&rwlock, NULL);
pthread_t reader_thread1, reader_thread2, writer_thread;
pthread_create(&reader_thread1, NULL, reader_func, (void*)1);
pthread_create(&reader_thread2, NULL, reader_func, (void*)2);
pthread_create(&writer_thread, NULL, writer_func, (void*)1);
pthread_join(reader_thread1, NULL);
pthread_join(reader_thread2, NULL);
pthread_join(writer_thread, NULL);
pthread_rwlock_destroy(&rwlock);
return 0;
}
4.示例解释
在上述代码中,我们使用pthread_rwlock_init
函数初始化了一个读写锁,然后创建了两个读线程和一个写线程。读线程通过pthread_rwlock_rdlock
函数获取读锁,写线程通过pthread_rwlock_wrlock
函数获取写锁,然后进行相应的读写操作。最后,通过pthread_rwlock_unlock
函数释放锁,并通过pthread_rwlock_destroy
函数销毁读写锁。