使用VS2022社区版远程连接LInux(CentOS7)操作时,已经加入头文件#include
读写锁与互斥量类似, 但读写锁允许更高的并行性, 其特性为
读写锁只有一把, 但其具备两种状态:
当读线程远大于写线程, 可以调高访问效率
读写锁操作函数:
/*定义一个读写锁变量*/
pthread_rwlock_t rwlock;
int pthread_rwlock_init(&rwlock,NULL);
int pthread_rwlock_destory(&rwlock);
int pthread_rwlock_rdlock(&rwlock);
int pthread_rwlock_wrlock(&rwlock);
int pthread_rwlock_tryrdlock(&rwlock);
int pthread_rwlock_trywrlock(&rwlock);
int pthread_rwlock_unlock(&rwlock);
都是成功返回0, 失败直接返回错误号
读写锁代码示例:
int cnt = 0;
pthread_rwlock_t rwlock;
void* writer(void* arg) {
long i = (long)arg;
while (1) {
pthread_rwlock_wrlock(&rwlock);
usleep(10000);
int t = cnt;
printf("I'm writer %ld, cnt = %d, ++cnt = %d\n", i, t, ++cnt);
pthread_rwlock_unlock(&rwlock);
usleep(100000);
}
return NULL;
}
void* reader(void* arg) {
long i = (long)arg;
while (1) {
pthread_rwlock_rdlock(&rwlock);
printf("I'm reader %ld, cnt = %d\n", i, cnt);
pthread_rwlock_unlock(&rwlock);
usleep(20000);
}
return NULL;
}
int main() {
pthread_rwlock_init(&rwlock, NULL);
pthread_t tid[8];
long i = 0;
for (; i < 3; ++i) {
pthread_create(tid + i, NULL, writer, (void*)i);
}
for (; i < 8; ++i) {
pthread_create(tid + 3 + i, NULL, reader, (void*)i);
}
for (i = 0; i < 8; ++i) {
pthread_join(tid[i], NULL);
}
pthread_rwlock_destroy(&rwlock);
}
现象:
I'm writer 0, cnt = 0, ++cnt = 1
I'm reader 3, cnt = 1
I'm reader 4, cnt = 1
I'm reader 5, cnt = 1
I'm reader 6, cnt = 1
I'm reader 7, cnt = 1
I'm writer 1, cnt = 1, ++cnt = 2
I'm writer 2, cnt = 2, ++cnt = 3
I'm reader 6, cnt = 3
I'm reader 3, cnt = 3
I'm reader 5, cnt = 3
I'm reader 4, cnt = 3
I'm reader 7, cnt = 3
I'm reader 3, cnt = 3
I'm reader 5, cnt = 3
I'm reader 6, cnt = 3
I'm reader 4, cnt = 3
I'm reader 7, cnt = 3
I'm reader 6, cnt = 3
I'm reader 5, cnt = 3
I'm reader 4, cnt = 3
I'm reader 3, cnt = 3
I'm reader 7, cnt = 3
I'm reader 4, cnt = 3
I'm reader 5, cnt = 3
I'm reader 3, cnt = 3
I'm reader 6, cnt = 3
I'm reader 7, cnt = 3
I'm writer 0, cnt = 3, ++cnt = 4
I'm reader 5, cnt = 4
I'm reader 3, cnt = 4
I'm reader 4, cnt = 4
I'm reader 6, cnt = 4
I'm reader 7, cnt = 4
I'm writer 1, cnt = 4, ++cnt = 5
I'm writer 2, cnt = 5, ++cnt = 6
I'm reader 5, cnt = 6
I'm reader 3, cnt = 6
I'm reader 4, cnt = 6
I'm reader 6, cnt = 6
I'm reader 7, cnt = 6
I'm reader 4, cnt = 6
I'm reader 5, cnt = 6
I'm reader 3, cnt = 6