//读写锁测试程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
//定义一个全局变量
int number = 0;
//定义一把读写锁
pthread_rwlock_t rwlock;
pthread_rwlockattr_t rwLockAttr;
//写线程回调函数
void * thread_write(void *arg){
int i = *(int *)arg;
int cur;
while(1){
//加写锁
printf("[%d]-wait write! \n",i);
pthread_rwlock_wrlock(&rwlock);
cur = number;
cur++;
sleep(0.5);
number = cur;
printf("[%d]-W:[%d]\n",i,cur);
//解锁
pthread_rwlock_unlock(&rwlock);
//sleep(rand()%3);
sleep(3);
}
}
//读线程回调函数
void *thread_read(void *arg){
int i = *(int *)arg;
int cur;
while(1){
//加读锁
pthread_rwlock_rdlock(&rwlock);
cur = number;
printf("[%d]-R:[%d]\n",i,cur);
sleep(2);
//解锁
pthread_rwlock_unlock(&rwlock);
//sleep(3);
}
}
int main(){
int n = 8;
int i =0;
int arr[8];
//定义线程 id
printf("PTHREAD_RWLOCK_PREFER_READER_NP = %d\n",PTHREAD_RWLOCK_PREFER_READER_NP);
printf("PTHREAD_RWLOCK_PREFER_WRITER_NP = %d\n",PTHREAD_RWLOCK_PREFER_WRITER_NP);
printf("PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP = %d\n",PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
pthread_t thread[8];
if(pthread_rwlockattr_init(&rwLockAttr)!=0)
{
printf("init rwlockattr attribute is failed ! erro reason is %s!\n",strerror(errno));
exit(0);
}
//初始化读写锁
pthread_rwlockattr_setkind_np(&rwLockAttr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
pthread_rwlock_init(&rwlock,&rwLockAttr);
//pthread_rwlock_init(&rwlock,NULL);
//创建是哪个写锁
for(i=0;i<3;i++){
arr[i] = i;
//创建写线程
pthread_create(&thread[i],NULL,thread_write,&arr[i]);
}
//创建5个读线程
for(i=3;i<n;i++){
arr[i] = i;
//创建读线程
pthread_create(&thread[i],NULL,thread_read,&arr[i]);
}
//回收子线程
int j = 0;
for(j=0;j<n;j++){
pthread_join(thread[j],NULL);
}
//释放锁
pthread_rwlock_destroy(&rwlock);
return 0;
}
|
1 |
|
理论:https://www.cnblogs.com/blackandwhite/p/12447522.html
实践:https://blog.csdn.net/weixin_43841155/article/details/127304105