当前位置: 首页 > article >正文

c++多线程处理数据

c++查询可以调动的线程个数

#include <iostream>
#include <thread>
 
int main() {
    // 查询可调动线程数量
    std::thread::hardware_concurrency();
 
    // 如果函数返回0,表示不支持并发,或者无法确定
    // 如果返回非0值,表示可以同时激活的线程数量
    unsigned int concurrency = std::thread::hardware_concurrency();
    std::cout << "可调动线程数量: " << concurrency << std::endl;
 
    return 0;
}

无返回值

在C++中处理大量数据时,可以使用多线程来提高处理速度。以下是一个简单的例子,展示了如何使用std::thread来并行处理数据集。

#include <iostream>
#include <vector>
#include <thread>
 
// 处理单个数据项的函数
void processData(const std::vector<int>& data, int threadIndex, int threadCount) {
    for (size_t i = threadIndex; i < data.size(); i += threadCount) {
        // 对数据项进行处理
        // 例如:std::cout << data[i] << std::endl;
    }
}
 
int main() {
    std::vector<int> data = {/* 初始化数据 */};
    const int threadCount = 4; // 假设我们想要4个线程
 
    std::vector<std::thread> threads;
    for (int i = 0; i < threadCount; ++i) {
        threads.emplace_back(processData, std::ref(data), i, threadCount);
    }
 
    for (auto& thread : threads) {
        thread.join(); // 等待所有线程完成
    }
 
    return 0;
}

有返回值

在C++中,创建一个有返回值的线程可以使用std::future和std::packaged_task。以下是一个简单的例子:

#include <iostream>
#include <future>
#include <thread>
 
// 函数返回一个整数
int returnValueFunction(int value) {
    return value * 2;
}
 
int main() {
    // 创建一个packaged_task
    std::packaged_task<int(int)> task(returnValueFunction);
 
    // 获取与task关联的未来
    std::future<int> result = task.get_future();
 
    // 创建线程并执行task
    std::thread t(std::move(task), 10);
 
    // 等待任务完成并获取结果
    int answer = result.get();
 
    std::cout << "The answer is " << answer << std::endl;
 
    // 清理线程资源
    t.join();
 
    return 0;
}

无返回值大数据

在这里插入图片描述

有返回值大数据


类内方法1
		int ConvertEntity(int  a1, double  a2,bool  a3,int  a4);//含形参和返回值要加线程的方法
类内方法2	通过线程调用类内方法1 且将结果加在类内变量里面
		// 定义线程要执行的函数,捕获myObject的引用
		auto threadFunction = [this](
			int a1,
			double a2,
			bool a3,
			int a4) {
				auto result = ConvertEntity(a1, a2, a3, a4);
				std::lock_guard<std::mutex> guard(mtx);//锁数据
				m_Dates.insert(m_Dates.begin(), result.begin(), result.end());
		};

		// 查询可调动线程数量
		std::thread::hardware_concurrency();

		// 如果函数返回0,表示不支持并发,或者无法确定
		// 如果返回非0值,表示可以同时激活的线程数量
		unsigned int threadCount = std::thread::hardware_concurrency();
		std::cout << "可调动线程数量: " << threadCount << std::endl;

		//获取当前时间点  
		auto start = std::chrono::high_resolution_clock::now();
		std::vector<std::list<DRW_Entity*>> _ents;
		int num = ents.size() / threadCount;
		std::vector<std::thread> threads;

		int startNum = 0;
		int endNum = 0;

		for (int i = 0; i < threadCount; ++i)
		{
			startNum = i == 0 ? 0 : endNum;
			endNum = (i == threadCount - 1) ? ents.size(): (endNum + num);
			threads.emplace_back(threadFunction,
				实参1,
				实参2,
				实参3,
				实参4);
		}
			// 等待所有线程完成
		for (auto& t : threads) {
			if (t.joinable()) {
				t.join();
			}
		}

http://www.kler.cn/a/376911.html

相关文章:

  • 使用ElasticSearch查询
  • 测试覆盖率
  • 功能篇:mybatis中实现缓存
  • SQL Server中可以通过扩展事件来自动抓取阻塞
  • 闲谭SpringBoot--ShardingSphere分库分表探究
  • 网络安全-web应用程序发展历程(基础篇)
  • 【Grafana】Grafana 基础入门
  • 多线程环境下内存池的实现(C++)
  • SpringBoot+FileBeat+ELK8.x版本收集日志
  • npm入门教程10:npm生命周期钩子
  • Flutter 获取照片权限的时候是否要获取存储权限?
  • SCSS在Vue中的用法
  • 微积分复习笔记 Calculus Volume 1 - 4.2 Linear Approximations and Differentials
  • 第7章 内容共享
  • adb 远程调试,手动修改 adb 调试授权信息
  • C++研发笔记11——C语言程序设计初阶学习笔记9
  • 力扣11.2
  • Python-GUI-概览
  • Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者
  • libaom 源码分析:AV1帧内预测 CfL 模式
  • cdn加速原理
  • Selective Generation for Language Models 语言模型的选择性生成
  • Uniswap/v2-core使用及其交易流程
  • 【游戏引擎之路】登神长阶(十)——游戏动画制作:我想成为那一道光!
  • ubuntu【桌面】 配置NAT模式固定IP
  • npm入门教程16:npm自动化CI/CD