在 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 时间,并打印出来。