21xrx.com
2024-06-03 06:34:35 Monday
登录
文章检索 我的文章 写文章
C++多线程文件读写实现
2023-07-08 13:46:05 深夜i     --     --
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++实现多线程文件读写操作,通过在多个线程之间进行文件读写,可以提高程序的效率和响应速度。需要注意的是,在多线程环境下要避免数据竞争和死锁等问题,必须采用合适的同步方法来保证数据的一致性和正确性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复