21xrx.com
2025-04-06 02:36:52 Sunday
文章检索 我的文章 写文章
C++多线程文件读写实现
2023-07-08 13:46:05 深夜i     13     0
C++ 多线程 文件读写

在计算机编程中,多线程编程是一项重要的技能,可以大大提高程序的运行效率和响应速度。而文件读写则是程序中常见的操作之一。本文将介绍如何使用C++实现多线程文件读写操作。

1. 多线程文件读取

C++中提供了fstream类来实现文件的读写操作。在多线程环境下,我们可以使用多个线程同时读取同一个文件,并将读取到的内容存储在不同的缓冲区中,最后再将缓冲区中的内容进行合并。

下面是一个简单的多线程文件读取示例代码:

#include <iostream>
#include <fstream>
#include <thread>
#include <vector>
using namespace std;
void read_file(string filename, int offset, int size, vector<char>& data)
{
  ifstream ifs(filename, ios::binary);
  if (ifs.is_open()) {
    ifs.seekg(offset);
    char* buffer = new char[size];
    ifs.read(buffer, size);
    for (int i = 0; i < size; i++) {
      data[offset+i] = buffer[i];
    }
    delete[] buffer;
    ifs.close();
  }
}
int main()
{
  string filename = "test.txt";
  int filesize = 100;
  int thread_num = 4;
  vector<vector<char>> results(thread_num, vector<char>(filesize/thread_num));
  vector<thread> threads(thread_num);
  for (int i = 0; i < thread_num; i++) {
    threads[i] = thread(read_file, filename, i*filesize/thread_num, filesize/thread_num, ref(results[i]));
  }
  for (auto& t : threads) {
    t.join();
  }
  // merge buffer
  vector<char> buffer(filesize);
  for (int i = 0; i < thread_num; i++) {
    for (int j = 0; j < filesize/thread_num; j++) {
      buffer[i*filesize/thread_num+j] = results[i][j];
    }
  }
  // process buffer
  cout << buffer.data() << endl;
  
  return 0;
}

上述代码中,首先定义了一个read_file函数,该函数用于在指定的偏移量和大小范围内读取文件内容,并将读取到的内容存储在一个vector 数组中。

然后,在主函数中定义了一个文件名、文件大小、线程数等变量,以及一个vector >数组用于存储所有线程读取到的数据,以及一个vector 数组用于存储所有线程的句柄。

接着,使用一个for循环创建了多个线程,并将它们指定的偏移量和大小范围传递给read_file函数,同时使用ref()函数将results数组中的子数组引用传递给read_file函数,以便保存读取到的数据。

最后,使用for循环将所有线程的数据合并到一个buffer数组中,并进行相关的处理。

2. 多线程文件写入

多线程文件写入与多线程文件读取的方法类似,只需将fstream对象的ios::in模式改为ios::out模式即可。具体实现代码如下:

#include <iostream>
#include <fstream>
#include <thread>
#include <vector>
using namespace std;
void write_file(string filename, int offset, int size, vector<char>& data)
{
  ofstream ofs(filename, ios::out | ios::binary);
  if (ofs.is_open()) {
    ofs.seekp(offset);
    ofs.write(data.data()+offset, size);
    ofs.close();
  }
}
int main()
{
  string filename = "test.txt";
  int filesize = 100;
  int thread_num = 4;
  vector<vector<char>> data(thread_num, vector<char>(filesize/thread_num, 'A'));
  vector<thread> threads(thread_num);
  for (int i = 0; i < thread_num; i++) {
    threads[i] = thread(write_file, filename, i*filesize/thread_num, filesize/thread_num, ref(data[i]));
  }
  for (auto& t : threads) {
    t.join();
  }
  return 0;
}

上述代码中,首先定义了一个write_file函数,该函数用于在指定的偏移量和大小范围内写入文件内容,从而实现多线程写入。

然后,在主函数中定义了一个文件名、文件大小、线程数等变量,以及一个vector >数组用于存储所有线程写入的数据,以及一个vector 数组用于存储所有线程的句柄。

接着,使用一个for循环创建了多个线程,并将它们指定的偏移量和大小范围传递给write_file函数,同时使用ref()函数将data数组中的子数组引用传递给write_file函数,以便写入数据。

最后,使用for循环等待所有线程的执行完毕即可。

总结

本文介绍了如何使用C++实现多线程文件读写操作,通过在多个线程之间进行文件读写,可以提高程序的效率和响应速度。需要注意的是,在多线程环境下要避免数据竞争和死锁等问题,必须采用合适的同步方法来保证数据的一致性和正确性。

  
  

评论区