首页 > 其他分享 >互斥锁练习题

互斥锁练习题

时间:2024-05-31 12:11:19浏览次数:21  
标签:练习题 rwlock NULL 互斥 线程 pthread txt buf

练习:设计一个程序,程序中有3个线程,主线程A创建一个文本,每隔5s获取一次系统时间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输出系统时间"hh:mm:ss",子线程c输出系统日期"2024年05月31日”,要求使用读写锁实现互斥。 提示:主线程A获取写操作的锁,另外的线程分别获取读操作的锁。

/***************************************************************************************
 *
 *	file name:  pthread_rwlock.c
 *	author	 :  Dazz
 *	date	 :  2024/05/31
 *	function :  练习:设计一个程序,程序中有3个线程,主线程A创建一个文本,每隔5s获取一次系统时
 *              间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输
 *              出系统时间"hh:mm:ss",子线程c输出系统日期"2024年05月31日”,要求使用读写锁实现
 *              互斥。 提示:主线程A获取写操作的锁,另外的线程分别获取读操作的锁。
 *
 * 	note	 :  link with -pthread.
 *
 *	CopyRight (c)  2024  [email protected]   All Right Reseverd
 *
 * ***************************************************************************************/

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <unistd.h>

// 定义读写锁
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

// 定义文件流指针
FILE *txt = NULL;

// 线程B用来输出系统时间"hh:mm:ss"
void *funcB(void *)
{
    // 读缓存区
    char buf[30] = "0";
    char *p;
    while (1)
    {
        // 上锁
        pthread_rwlock_rdlock(&rwlock);

        // 读取缓存区里的系统时间
        fread(buf, sizeof(buf), 1, txt);

        // 文件光标移到开头
        fseek(txt, 0, SEEK_SET);

        // 解锁
        pthread_rwlock_unlock(&rwlock);

        // 用strstr处理字符串
        p = strstr(buf, ",");
        p = strtok(buf, ",");
        p = strtok(NULL, ",");

        printf("this is funcB,this is what I read:%s\n", p);

        sleep(2);
    }
}

//
// 线程C用来输出系统时间"2024年05月31日”
void *funcC(void *)
{
    // 读缓存区
    char buf[30] = "0";
    char *p;
    while (1)
    {
        // 上锁
        pthread_rwlock_rdlock(&rwlock);

        // 读取缓存区里的系统时间
        fread(buf, sizeof(buf), 1, txt);

        // 文件光标移到开头
        fseek(txt, 0, SEEK_SET);

        // 解锁
        pthread_rwlock_unlock(&rwlock);

        // 用strtok处理字符串
        p = strtok(buf, ",");

        printf("this is funcC,this is what I read:%s\n", p);

        sleep(2);
    }
}

int main()
{
    // 创建一个文本
    txt = fopen("./txt.log", "wb+");
    if (NULL == txt)
    {
        fprintf(stderr, "fopen fail!,error: %d, %s\n", errno, strerror(errno));
        exit(1);
    }

    // 初始化读写锁
    pthread_rwlock_init(&rwlock, NULL);

    // 创建线程B和C
    pthread_t threadB;
    pthread_t threadC;

    // 执行线程B和C
    pthread_create(&threadB, NULL, funcB, NULL);
    pthread_create(&threadC, NULL, funcC, NULL);

    // 定义一个时间变量
    time_t timep;
    struct tm *timerow;

    while (1)
    {
        // 获取当前当前的时间戳
        timep = time(NULL);

        // 将时间戳的地址作为参数传递给函数localtime
        timerow = localtime(&timep);

        // 上锁
        pthread_rwlock_wrlock(&rwlock);

        // 将读取到的系统时间写入txt.log文本中
        fprintf(txt, "%d年%d月%d日,%d:%d:%d",
                timerow->tm_year + 1900,
                timerow->tm_mon + 1,
                timerow->tm_mday,
                timerow->tm_hour,
                timerow->tm_min,
                timerow->tm_sec);

        // 将光标重新指向文件头
        fseek(txt, 0, SEEK_SET);

        // 解锁
        pthread_rwlock_unlock(&rwlock);
    }

    return 0;
}

标签:练习题,rwlock,NULL,互斥,线程,pthread,txt,buf
From: https://www.cnblogs.com/Dazz24/p/18224253

相关文章

  • C语言练习题之——从简单到烧脑(11)(每日两道)
    题目1:有两个矩阵a[3][2],b[2][2],元素值由键盘输入,计算a与b的矩阵之和(两个矩阵循环中相加,结尾求和)#include<stdio.h>intmain(){ intarr[3][2],brr[2][2],i,j,sum1=0,sum2=0; for(i=0;i<3;i++) { for(j=0;j<2;j++) { scanf_s("%d",&arr[i][j]);......
  • 数据结构 顺序表(C语言 与 Java实现)以及部分练习题
    目录数据结构数组(顺序表)特点使用Java实现更高级的数组C语言实现总结优点缺点例题26.删除有序数组中的重复项1.两数之和27.移除元素153.寻找旋转排序数组中的最小值485.最大连续1的个数414.第三大的数2656.K个元素的最大和LCP06.拿硬币2057.值相等的最小索引26.删......
  • 线程练习题
    编写一个程序,主线程中创建一个子线程,容纳后让主线程先退出并返回一个值,子线程接合主线程后输出主线程的退出值,然后子线程退出./********************************************************************* filename:pthread.c* author :Dazz* date :2024/05/29*......
  • 线程的互斥锁
    【一】未加锁会产生的问题所有子线程都会进行阻塞操作,导致最后的改变只是改了一次fromthreadingimportThreadimporttimemoney=100deftask():globalmoney#模拟获取到车票信息temp=money#模拟网络延迟time.sleep(2)#模拟购票......
  • 自旋锁与互斥锁的区别
    编程世界中,锁用来保护一个资源不会因为并发操作而引起冲突,导致数据不准确。常见的锁有互斥锁、读写锁、自旋锁、信号量、分布式锁等等。这里仅仅讨论互斥锁和自旋锁的区别。自旋锁是当资源被占用时,锁逻辑循环判断资源是否可用,而不是把进程挂起,直到资源可用。自旋锁采用的是,循......
  • 3个进程实现共享内存、信号量、互斥访问
    V1.02024年5月28日发布于博客园题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互......
  • 共享内存练习题
    设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进程C需要使......
  • 系统编程练习题---利用共享内存和信号量集,完成两个进程之间的互斥通信
    目录题目解析代码展示process_A.cprocess_B.cprocess_C.c结果展示重要知识点记录题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程......
  • A申请共享内存并对信号量进行初始化,然后进程B与C实现互斥
    练习:设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进......
  • 利用信息量集实现互斥访问
    进程A用来生成信号集,并将其初值设为1(运行顺序为进程A->B->C)/**@Author:[email protected]*@Date:2024-05-0817:20:41*@LastEditors:[email protected]*@LastEditTime:2024-05-2818:47:38*/#include<stdio.h>#include<stdlib.h>#include<sys/......