背景
题目描述:
- 示例文件为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

这篇博客演示了一个C++11实现的多线程程序,用于读取文件内容并进行累加计算。通过互斥锁mutex确保线程安全,同时展示了文件操作和线程同步的技巧。代码中创建了N个线程,每个线程读取文件一部分并更新全局累加变量sum,最后输出总和。
&spm=1001.2101.3001.5002&articleId=123302281&d=1&t=3&u=a23aaf5f16b44b33a8392ccc403e9af8)
1758

被折叠的 条评论
为什么被折叠?



