使用c++实现多线程同时读取一个大文件的数据
1.使用C++11中的std::thread库创建多个线程,每个线程负责读取文件的一部分数据。
2.使用std::ifstream打开文件,并使用seekg函数定位到每个线程需要读取的位置。
3.在每个线程中使用std::getline函数逐行读取数据,并将读取的数据存储到一个共享的数据结构中(如std::vector或std::queue)。
4.使用std::mutex和std::lock_guard保护共享数据结构,以避免多个线程同时写入数据。
示例代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <thread>
#include <mutex>
#include <queue>
std::mutex mtx;
std::queue<std::string> data_queue;
void read_file(const std::string& filename, std::streampos start_pos, std::streampos end_pos) {
std::ifstream file(filename);
file.seekg(start_pos);
std::string line;
while (file.tellg() < end_pos && std::getline(file, line)) {
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(line);
}
}
int main() {
const std::string filename = "data.txt";
const int num_threads = 4;
std::ifstream file(filename);
const std::streampos file_size = file.seekg(0, std::ios::end).tellg();
const std::streampos chunk_size = file_size / num_threads;
std::vector<std::thread> threads;
for (int i = 0; i < num_threads; ++i) {
const std::streampos start_pos = i * chunk_size;
const std::streampos end_pos = (i + 1) * chunk_size;
threads.emplace_back(read_file, filename, start_pos, end_pos);
}
for (auto& t : threads) {
t.join();
}
// Do something with the data in the data_queue
while (!data_queue.empty()) {
std::cout << data_queue.front() << std::endl;
data_queue.pop();
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/gVO 著作权归作者所有。请勿转载和采集!