米榜饴 发表于 4 天前

读写锁练习

程序中有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 = {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 = {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 = {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;

}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 读写锁练习