读写锁的概念和使用
读写锁Read-Write Lock详解1. 基本概念读写锁是一种特殊的同步机制允许多个线程同时读取共享资源但只允许一个线程写入资源。这种设计在读多写少的场景下能显著提升并发性能。2. 核心特性2.1 写者Writer行为写者使用写锁写锁定获取条件当且仅当当前没有其他读者读锁持有者和没有其他写者写锁持有者时写者才能立即获得写锁等待机制如果条件不满足写者将进入阻塞状态直到没有任何读者和写者为止2.2 读者Reader行为读者使用读锁读锁定获取条件只要当前没有写者写锁持有者读者就能立即获得读锁并发读取允许多个读者同时持有读锁实现并发读取等待机制如果当前有写者持有写锁读者将等待直到写者释放写锁3. 重要注意事项3.1 锁状态规则互斥性同一时刻只能有一个线程持有写锁共享性同一时刻可以有多个线程持有读锁状态优先级当读写锁处于写锁状态时所有试图加锁的线程无论是读锁还是写锁都会被阻塞当读写锁处于读锁状态时如果有写者试图加写锁该写者会等待并且之后到达的读者请求也会被阻塞以防止写者长时间无法获得锁写者饥饿3.2 避免写者饥饿读写锁通常采用写者优先或公平策略一旦有写者在等待新到达的读者请求会被暂时阻塞确保等待中的写者有机会获得锁避免写者因持续有读者到达而永远无法执行。4. POSIX 读写锁 API 函数函数功能描述参数说明pthread_rwlock_init初始化读写锁rwlock: 读写锁指针attr: 属性指针通常为NULLpthread_rwlock_rdlock读锁定阻塞式rwlock: 读写锁指针pthread_rwlock_tryrdlock尝试读锁定非阻塞rwlock: 读写锁指针返回成功返回0失败返回错误码pthread_rwlock_wrlock写锁定阻塞式rwlock: 读写锁指针pthread_rwlock_trywrlock尝试写锁定非阻塞rwlock: 读写锁指针返回成功返回0失败返回错误码pthread_rwlock_unlock解锁读写锁rwlock: 读写锁指针pthread_rwlock_destroy销毁读写锁rwlock: 读写锁指针5. 使用示例#includepthread.h#includestdio.hpthread_rwlock_trwlock;intshared_data0;void*reader(void*arg){pthread_rwlock_rdlock(rwlock);printf(Reader %ld: shared_data %d\n,(long)arg,shared_data);pthread_rwlock_unlock(rwlock);returnNULL;}void*writer(void*arg){pthread_rwlock_wrlock(rwlock);shared_data;printf(Writer %ld: updated shared_data to %d\n,(long)arg,shared_data);pthread_rwlock_unlock(rwlock);returnNULL;}intmain(){pthread_tthreads[5];pthread_rwlock_init(rwlock,NULL);// 创建2个写者和3个读者for(inti0;i5;i){if(i2){pthread_create(threads[i],NULL,writer,(void*)(long)i);}else{pthread_create(threads[i],NULL,reader,(void*)(long)i);}}for(inti0;i5;i){pthread_join(threads[i],NULL);}pthread_rwlock_destroy(rwlock);return0;}