在 Linux C 中,你可以使用 pthread 库来创建多线程,并使用文件 I/O 来对文件进行读取和写入操作。以下是一个简单的示例代码,演示如何在 C 语言中开启 8 个线程同时读取一个文件并将其分成 8 段保存到 8 个临时文件中:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>#define NUM_THREADS 8// 结构体用于传递参数给线程函数
struct ThreadArgs {FILE *inputFile;FILE *outputFile;size_t startOffset;size_t endOffset;
};// 线程函数,用于将文件分段读取并保存到临时文件中
void *readAndWriteFile(void *threadArgs) {struct ThreadArgs *args = (struct ThreadArgs *)threadArgs;size_t blockSize = args->endOffset - args->startOffset + 1;fseek(args->inputFile, args->startOffset, SEEK_SET);char *buffer = malloc(blockSize);fread(buffer, blockSize, 1, args->inputFile);fseek(args->outputFile, args->startOffset, SEEK_SET);fwrite(buffer, blockSize, 1, args->outputFile);fclose(args->outputFile);free(buffer);pthread_exit(NULL);
}int main() {FILE *inputFile = fopen("input.txt", "r");if (inputFile == NULL) {perror("Error opening input file");return 1;}// 创建 8 个临时文件FILE *outputFiles[NUM_THREADS];for (int i = 0; i < NUM_THREADS; i++) {char filename[20];sprintf(filename, "output%d.txt", i);outputFiles[i] = fopen(filename, "w");if (outputFiles[i] == NULL) {perror("Error creating output file");return 1;}}// 计算每个线程读取的数据块大小fseek(inputFile, 0, SEEK_END);size_t fileSize = ftell(inputFile);size_t blockSize = fileSize / NUM_THREADS;size_t lastBlockSize = fileSize - (blockSize * (NUM_THREADS - 1));pthread_t threads[NUM_THREADS];struct ThreadArgs threadArgs[NUM_THREADS];// 创建线程,每个线程读取文件的一部分并保存到临时文件中for (int i = 0; i < NUM_THREADS; i++) {threadArgs[i].inputFile = inputFile;threadArgs[i].outputFile = outputFiles[i];threadArgs[i].startOffset = i * blockSize;threadArgs[i].endOffset = (i == NUM_THREADS - 1) ? (blockSize * (i+1) + lastBlockSize - 1) : (blockSize * (i+1) - 1);pthread_create(&threads[i], NULL, readAndWriteFile, (void *)&threadArgs[i]);}// 等待所有线程结束for (int i = 0; i < NUM_THREADS; i++) {pthread_join(threads[i], NULL);}printf("File divided and saved to temporary files successfully.\n");fclose(inputFile);for (int i = 0; i < NUM_THREADS; i++) {fclose(outputFiles[i]);}return 0;
}
在上面的示例中,我们使用了 pthread 库来创建了 8 个线程,并使用文件 I/O 对文件进行读取和写入操作,将文件平均分成 8 段保存到 8 个临时文件中。在主函数中,我们首先打开了输入文件,然后创建了 8 个临时文件。随后计算并分配了每个线程的读取范围,并创建了 8 个线程来处理文件的读取和写入操作。最后等待所有线程的执行完毕,关闭所有文件,并结束了程序。
要计算从 fopen
到 return 0
之间的时间,你可以使用 clock()
函数来获取程序执行的 CPU 时间。此外,你还可以使用 time()
函数来获取当前时间戳。以下是一个简单的示例代码,演示了如何在程序中添加时间戳并计算程序执行的时间:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>#define NUM_THREADS 8// 结构体用于传递参数给线程函数
struct ThreadArgs {FILE *inputFile;FILE *outputFile;size_t startOffset;size_t endOffset;
};// 线程函数,用于将文件分段读取并保存到临时文件中
void *readAndWriteFile(void *threadArgs) {// ...(省略线程函数的实现)
}int main() {clock_t start, end;double cpu_time_used;start = clock(); // 记录程序开始执行的 CPU 时间time_t rawtime;struct tm *timeinfo;time(&rawtime);timeinfo = localtime(&rawtime);printf("Start time: %s", asctime(timeinfo)); // 打印程序开始执行的时间FILE *inputFile = fopen("input.txt", "r");if (inputFile == NULL) {perror("Error opening input file");return 1;}// ...(省略创建临时文件和线程的代码)end = clock(); // 记录程序结束执行的 CPU 时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;printf("CPU time used: %f seconds\n", cpu_time_used); // 打印程序执行的 CPU 时间time(&rawtime);timeinfo = localtime(&rawtime);printf("End time: %s", asctime(timeinfo)); // 打印程序结束执行的时间fclose(inputFile);// ...(省略关闭临时文件和线程的代码)return 0;
}
在上面的示例中,我们首先使用 clock()
函数记录了程序开始执行的 CPU 时间,并使用 time()
函数获取了程序开始执行的时间戳,并打印出来。在程序执行结束后,我们再次使用 clock()
函数记录了程序结束执行的 CPU 时间,并再次使用 time()
函数获取了程序结束执行的时间戳,并打印出来。最后,我们计算了程序执行的 CPU 时间,并打印出来。