读写锁练习

程序中有3个线程,主线程A创建一个文本,每隔6s获取一次系统时间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输出系统时间”hh:mm:ss”,子线程C输出系统日期”2025年05月9日”,使用读写锁实现互斥。

/********************************************************************************
*
*
* 读写锁操作
* author:jindouliu2024@163.com 
* date:2025.5.9
* 
*
* Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
* *******************************************************************************/

#include<stdio.h>
#include<time.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
void *task_1(void *arg)
{
	char buf[100] = {0};
	while(1){
		//获取读操作锁
		pthread_rwlock_rdlock(&rwlock);
		//以只读方式打开文件
		FILE *fp = fopen("./a.txt","r");
		fread(buf,1,100,fp);
		char *str = strtok(buf,"|");
		printf("%s\n",str);
		
		//归还读操作锁
		pthread_rwlock_unlock(&rwlock);
		sleep(1);
	}

}
void *task_2(void *arg)
{
	char buf[100] = {0};
	while(1){
		//获取读操作锁
		pthread_rwlock_rdlock(&rwlock);
		//以只读方式打开文件
		FILE *fp = fopen("./a.txt","r");
		fread(buf,1,100,fp);
		char *str = strtok(buf,"|");
		str = strtok(NULL,"|");
		printf("%s\n",str);
		
		//归还读操作锁
		pthread_rwlock_unlock(&rwlock);
		sleep(1);
	}
}
int main()
{
	time_t tim;
	struct tm *ptim;
	int wday;
	char buf[100] = {0};
	pthread_t task1;
	pthread_t task2;
	//初始化读写锁
	pthread_rwlock_init(&rwlock,NULL);
	//创建两个线程
	pthread_create(&task1,NULL,task_1,NULL);
	pthread_create(&task2,NULL,task_2,NULL);
	while(1){
		//获取当前系统时间
		tim = time(NULL);
		//转换为年月日时分秒
		ptim = localtime(&tim);
	
		//将转换好的日期放入buf
		sprintf(buf,"%d 年 %d 月 %d 日 | %d :%d : %d\n",
							ptim->tm_year+1900,
							ptim->tm_mon+1,
							ptim->tm_mday,
							ptim->tm_hour,
							ptim->tm_min,
							ptim->tm_sec);
		
		//获取写操作锁
		pthread_rwlock_wrlock(&rwlock);
		//打开一个文件,如果不存在则创建
		FILE *fp = fopen("./a.txt","w+");
		//将buf里的内容写入文件
		fwrite(buf,1,strlen(buf),fp);
		fclose(fp);
		
		//归还写操作锁
		pthread_rwlock_unlock(&rwlock);
		sleep(6);

	}
	return 0;

}
posted @ 2025-05-09 15:14  LRadian  阅读(56)  评论(0)    收藏  举报