背景
题目描述:
- 示例文件为data.txt
- 要求使用多线程方式计算
线程数量定义为N
将数据分给N个线程计算
汇总计算得到所需值
涉及的知识点
c++11多线程互斥量,锁的使用,文件读取的操作
实现代码
#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream> //文件操作头文件
#include <thread> //多线程头文件
#include <mutex>
#include <shared_mutex>
#include <vector>
using namespace std;
/*
该demo实现多线程对文件读取,并进行累加
1.涉及文件读取操作
2.多线程创建,并进行读锁的利用
3.对获取的数据进行累加汇总
*/
//定义文件路径
const string FILE_PATH = "C:\\Users\\Administrator\\Desktop\\leetcode\\test.txt";
//定义全局变量,用于统计线程总数据
int32_t sum = 0;
//定义互斥量
mutex mtx_1;
mutex mtx_2;
//定义N个线程
constexpr int32_t N = 3;
void DealFileTask(istream& ifs)
{
string buf;
//判断文件是否读到末尾
while(!ifs.eof()){
if (mtx_1.try_lock()) {
while(getline(ifs, buf)) {
{
std::unique_lock<mutex> lck(mtx_2);
sum += atoi(buf.c_str());
cout << buf << endl;
}
}
mtx_1.unlock();
}
}
return;
}
int main()
{
//文件读取操作
//创建流对象,以读形式打开文件
ifstream ifs;
//打开文件并判断文件是否打开成功
ifs.open(FILE_PATH, ios::in);
if (!ifs.is_open())
{
cout << "file read failed" << endl;
ifs.close();
return -1;
}
//创建两个线程去执行任务
//计算多线程总共
std::vector<std::thread> vec;
for(int i = 0; i < N; i++) {
vec.push_back(thread(DealFileTask, std::ref(ifs)));
}
for(int i = 0; i < N; i++) {
vec[i].join();
}
//关闭文件
cout << "sum is " << sum << endl;
ifs.close();
return 0;
}
运行结果
这里将设置为3,此值可改变,结果多次验证,输出稳定
编译工程使用CMake方法
文件结构
文件结构
cmake_minimum_required(VERSION 3.0)
project(main)
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb -std=c++17 -pthread")
#set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread")
set( src
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
)
add_executable(main
${src}
)
编译构建方法
- mkdir build文件夹
- cd 到 build文件夹
- cmake -G “MinGW Makefiles” …
- make
- .\main.exe