读写锁的特点
读的时候不可以写 可以读
写的时候不可以读
读写锁写的优先级高
代码环境
Ubuntu18.04+vscode C标准gnu11
/*
读写锁的类型 pthread_rwlock_t
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
读的时候不可以写 可以读
写的时候不可以读
读写锁写的优先级高
案例:8个线程操作同一个全局变量。
3个线程不定时写这个全局变量,5个线程不定时的读这个全局变量
*/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 创建一个共享数据
int num = 1;
// pthread_mutex_t mutex;
pthread_rwlock_t rwlock;
void * writeNum(void * arg) {
while(num<50) {
pthread_rwlock_wrlock(&rwlock);//写锁
if(num<50){
++num;
printf("++write, tid : %ld, num : %d\n", pthread_self(), num);
}else{
pthread_rwlock_unlock(&rwlock);
break;
}
pthread_rwlock_unlock(&rwlock);
usleep(100);
}
return NULL;
}
void * readNum(void * arg) {
while(num<50) {
pthread_rwlock_rdlock(&rwlock);//读锁
if(num<50){
printf("===read, tid : %ld, num : %d\n", pthread_self(), num);
}else{
pthread_rwlock_unlock(&rwlock);
break;
}
pthread_rwlock_unlock(&rwlock);
usleep(100);
}
return NULL;
}
int main() {
//读写锁初始化
pthread_rwlock_init(&rwlock, NULL);
// 创建3个写线程,5个读线程
pthread_t wtids[3], rtids[5];
for(int i = 0; i < 3; i++) {
pthread_create(&wtids[i],NULL,writeNum,NULL);
}
for(int i = 0; i < 5; i++) {
pthread_create(&rtids[i], NULL, readNum, NULL);
}
// 设置线程分离
for(int i = 0; i < 3; i++) {
pthread_detach(wtids[i]);
}
for(int i = 0; i < 5; i++) {
pthread_detach(rtids[i]);
}
//主线程结束,不会影响子线程
pthread_exit(NULL);
printf("main thread end!\n");//这一条不会执行
//读写锁销毁
pthread_rwlock_destroy(&rwlock);
return 0;
}