对多线程并发的模拟:
1、 创建5个线程,sleep一个随机的时间后,对同一个文件写。
2、
创建另外1个线程,读出5个线程写的文件内容。
3、 使用信号量同步多线程之间的并发,要求没写一次,读取一次。
文件读出的内容大致如下所示:
线程5写进文件,数值为:;4个这个星号
线程3写进文件,数值为:;4个这个星号
线程2写进文件,数值为:*;4个这个星号
Linux程序设计来个人
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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