在Linux下,你可以使用标准库中的lseek
和read
系统调用来实现多线程读取同一个文件。下面是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int fileDescriptor;
pthread_mutex_t mutex;
void* readFromFile(void* arg)
{
char buffer[BUFFER_SIZE];
ssize_t bytesRead;
while (1) {
off_t offset;
// 加锁
pthread_mutex_lock(&mutex);
// 使用lseek获取当前线程要读取的文件位置偏移量
offset = lseek(fileDescriptor, 0, SEEK_CUR);
// 使用read系统调用读取文件内容
bytesRead = read(fileDescriptor, buffer, BUFFER_SIZE);
// 解锁
pthread_mutex_unlock(&mutex);
if (bytesRead == -1) {
perror("read");
break;
}
// 判断是否已经到达文件末尾
if (bytesRead == 0)
break;
printf("Thread %lu reads from offset %ld:\n", pthread_self(), offset);
// 在控制台上打印输出
write(STDOUT_FILENO, buffer, bytesRead);
}
return NULL;
}
int main()
{
const char* filename = "example.txt";
const int numThreads = 4;
// 打开文件
fileDescriptor = open(filename, O_RDONLY);
if (fileDescriptor == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 创建线程数组
pthread_t threads[numThreads];
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
for (int i = 0; i < numThreads; ++i) {
pthread_create(&threads[i], NULL, readFromFile, NULL);
}
// 等待所有线程结束
for (int i = 0; i < numThreads; ++i) {
pthread_join(threads[i], NULL);
}
// 关闭文件描述符
close(fileDescriptor);
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
该示例程序创建了4个线程,并发地从同一个文件中读取数据。每个线程通过调用lseek
和read
系统调用来读取文件内容,并在控制台上打印输出。
在每次要读取文件之前,线程会先获取互斥锁,然后使用lseek
获取当前线程要读取的文件位置偏移量,接着使用read
系统调用来读取文件内容。完成后释放互斥锁。
请注意,在实际应用中,你可能需要根据具体需求对代码进行适当的错误处理和优化。
内容由零声教学AI助手提供,问题来源于学员提问