2301_76546689 2023-04-04 15:10 采纳率: 100%
浏览 25
已结题

Linux程序设计来个人

对多线程并发的模拟:
1、 创建5个线程,sleep一个随机的时间后,对同一个文件写。
2、
创建另外1个线程,读出5个线程写的文件内容。
3、 使用信号量同步多线程之间的并发,要求没写一次,读取一次。
文件读出的内容大致如下所示:
线程5写进文件,数值为:;4个这个星号
线程3写进文件,数值为:
;4个这个星号
线程2写进文件,数值为:*;4个这个星号

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-04 15:19
    关注

    基于Monster 组和GPT的调写:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    
    #define NUM_THREADS 5
    #define FILENAME "test.txt"
    
    char data[NUM_THREADS][20] = {"线程1写进文件,数值为:", "线程2写进文件,数值为:*", "线程3写进文件,数值为:", "线程4写进文件,数值为:", "线程5写进文件,数值为:"};
    
    sem_t write_sem, read_sem;
    FILE* fp;
    
    void* write_file(void* arg) {
        int id = *(int*) arg;
        int sleep_time = rand() % 5 + 1;  // 随机睡眠时间
        sleep(sleep_time);
        sem_wait(&write_sem);
        fprintf(fp, "%s", data[id]);
        for (int i = 0; i < 4; i++) {
            fprintf(fp, "★");
        }
        fprintf(fp, "\n");
        fflush(fp);
        sem_post(&read_sem);
        pthread_exit(NULL);
    }
    
    void* read_file(void* arg) {
        char buffer[1024];
        sem_wait(&read_sem);
        fseek(fp, 0, SEEK_SET);
        while (fgets(buffer, sizeof(buffer), fp)) {
            printf("%s", buffer);
        }
        sem_post(&write_sem);
        pthread_exit(NULL);
    }
    
    int main() {
        pthread_t threads[NUM_THREADS+1];
        int thread_ids[NUM_THREADS+1];
        fp = fopen(FILENAME, "w+");
        if (fp == NULL) {
            printf("无法打开文件 %s\n", FILENAME);
            exit(EXIT_FAILURE);
        }
        sem_init(&write_sem, 0, 1);
        sem_init(&read_sem, 0, 0);
        for (int i = 0; i < NUM_THREADS; i++) {
            thread_ids[i] = i;
            pthread_create(&threads[i], NULL, write_file, (void*) &thread_ids[i]);
        }
        pthread_create(&threads[NUM_THREADS], NULL, read_file, NULL);
        for (int i = 0; i < NUM_THREADS+1; i++) {
            pthread_join(threads[i], NULL);
        }
        sem_destroy(&write_sem);
        sem_destroy(&read_sem);
        fclose(fp);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 修改了问题 4月4日
  • 创建了问题 4月4日

悬赏问题

  • ¥100 描述一下元器件的基本功能,pcba板的基本原理
  • ¥15 STM32无法向设备写入固件
  • ¥15 使用ESP8266连接阿里云出现问题
  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan