一、问题描述
- 主函数根据当前进程id生成一个随机数。
- 写进程以线程参数的形式获取此随机数并将其写入到共享数据中,即
share_data = *(int *)arg;
,写入后退出。 - 累计五个读者需要依此将此共享数据在控制台输出,即
printf("%d\n", share_data);
,输出后退出。
二、代码
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <stdlib.h>
int count = 0;
pthread_mutex_t mutex;
pthread_mutex_t mutex_count;
int share_data;
void *Writer(void *arg) {
pthread_mutex_lock(&mutex);
share_data = *(int *)arg;
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *Reader(void *arg) {
pthread_mutex_lock(&mutex_count);
if (count == 0) {
pthread_mutex_lock(&mutex);
}
count++;
pthread_mutex_unlock(&mutex_count);
printf("%d\n", share_data);
pthread_mutex_lock(&mutex_count);
count--;
if (count == 0) {
pthread_mutex_unlock(&mutex);
}
pthread_mutex_unlock(&mutex_count);
pthread_exit(NULL);
}
int main() {
pthread_mutex_init(&mutex, NULL);
pthread_mutex_init(&mutex_count, NULL);
pthread_t thread[6];
memset(thread, 0, 6 * sizeof(pthread_t));
int data;
int log_fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0755);
srand(getpid());
data = rand() % 10;
for (int i = 0; i < 5; i++) {
char buffer[3];
buffer[0] = data + 48;
buffer[1] = 10;
buffer[2] = 0;
write(log_fd, buffer, strlen(buffer));
}
close(log_fd);
for (int i = 0; i < 1; i++) {
pthread_create(&thread[i], NULL, Writer, (void *)(&data));
}
sleep(1);
for (int i = 1; i < 6; i++) {
pthread_create(&thread[i], NULL, Reader, NULL);
}
for (int i = 0; i < 6; i++) {
pthread_join(thread[i], NULL);
}
pthread_mutex_destroy(&mutex);
pthread_mutex_destroy(&mutex_count);
return 0;
}
三、评测脚本
#!/bin/bash
gcc ./main.c -o exe -w -lpthread >error.txt 2>&1
if [ -f exe ]; then
./exe >result.txt 2>error.txt
if [ ! -s error.txt ]; then
diff result.txt log.txt >error.txt 2>&1
if [ "$?" == "0" ]; then
echo "读者读取数据完成"
else
echo "读者读取数据失败"
echo -n "写者写入的数据为:"
cat log.txt
echo -n "您编写的代码中读者读取的数据为:"
cat result.txt
fi
else
echo "程序执行错误"
echo -n "错误原因:"
cat error.txt
fi
else
echo "编译程序失败"
echo -n "错误原因:"
cat error.txt
fi
rm -rf case result.txt log.txt error.txt >/dev/null 2>&1