当前读写锁的状态 | 线程发出“读”请求 | 线程发出“写”请求 |
---|---|---|
无锁 | 允许占用 | 允许占用 |
读锁 | 允许占用 | 阻塞线程执行 |
写锁 | 阻塞线程执行 | 阻塞线程执行 |
<pthread.h>
头文件中。举个例子:
pthread_rwlock_t myRWLock;由此,我们就成功创建了一个读写锁。但要想使用 myRWLock 读写锁,还需要进行初始化操作。
pthread_rwlock_t myRWLock = PTHREAD_RWLOCK_INITIALIZER;还可以借助 pthread_rwlock_init() 函数初始化读写锁,此函数的语法格式为:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);rwlock 参数用于指定要初始化的读写锁变量;attr 参数用于自定义读写锁变量的属性,置为 NULL 时表示以默认属性初始化读写锁。
当 attr 参数为 NULL 时,以上两种初始化方式完全等价。
int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock); int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock);其中,rwlock 参数指的是初始化好的读写锁。
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock); int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock);rwlock 参数指的是初始化好的读写锁。
int pthread_rwlock_unlock (pthread_rwlock_t* rwlock);rwlock 参数表示要释放的读写锁。
int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);参数 rwlock 表示要销毁的目标读写锁。
#include <pthread.h> #include <stdio.h> #include <unistd.h> int x = 0; //创建读写锁变量 pthread_rwlock_t myrwlock; void* read_thread(void* args){ printf("------%u read_thread ready\n",pthread_self()); while (1) { sleep(1); //请求读锁 pthread_rwlock_rdlock(&myrwlock); printf("read_thread: %u,x=%d\n", pthread_self(), x); sleep(1); //释放读写锁 pthread_rwlock_unlock(&myrwlock); } return NULL; } void* write_thread(void* param) { printf("------%u write_thread ready!\n",pthread_self()); while (1) { sleep(1); // 请求写锁 pthread_rwlock_wrlock(&myrwlock); ++x; printf("write_thread: %u,x=%d\n", pthread_self(), x); sleep(1); //释放读写锁 pthread_rwlock_unlock(&myrwlock); } return NULL; } int main() { int i; //初始化读写锁 pthread_rwlock_init(&myrwlock, NULL); //创建 3 个读 x 变量的线程 pthread_t readThread[3]; for (i = 0; i < 3; ++i) { pthread_create(&readThread[i], NULL, read_thread, NULL); } //创建 1 个修改 x 变量的线程 pthread_t writeThread; pthread_create(&writeThread, NULL, write_thread, NULL); //等待各个线程执行完成 pthread_join(writeThread, NULL); for (int i = 0; i < 3; ++i) { pthread_join(readThread[i], NULL); } //销毁读写锁 pthread_rwlock_destroy(&myrwlock); return 0; }假设程序编写在 thread.c 文件中,执行过程如下:
[root@localhost ~]# gcc thread.c -o thread.exe -lpthread [root@localhost ~]# ./mythread.exe ------1134741248 read_thread ready ------1113761536 read_thread ready ------1103271680 write_thread ready! ------1124251392 read_thread ready read_thread: 1124251392,x=0 read_thread: 1113761536,x=0 read_thread: 1134741248,x=0 write_thread: 1103271680,x=1 read_thread: 1134741248,x=1 read_thread: 1124251392,x=1 read_thread: 1113761536,x=1 write_thread: 1103271680,x=2 read_thread: 1124251392,x=2 read_thread: 1113761536,x=2 read_thread: 1134741248,x=2
程序中共创建了 4 个子线程,其中 3 个线程用于读取 x 变量的值,读取变量前会先获得“读锁”。剩余的 1 个线程用于修改 x 变量的值,修改前先获得“写锁”。注意,此程序会一直执行,按 "Ctrl+Z" 组合键可以使程序停止。
除了读写锁,线程同步的实现方式还有互斥锁、信号量以及条件变量。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有