0

0

C++ 匿名函数和函数对象在多线程编程中的作用

王林

王林

发布时间:2024-08-21 13:24:03

|

453人浏览过

|

来源于php中文网

原创

在多线程编程中,匿名函数和函数对象可用于创建可调用的代码块,在不创建单独函数的情况下处理并发任务。匿名函数是通过 lambda 表达式定义的,函数对象是通过重载 operator()() 函数实现的类。此类特性使其在并行化任务中十分有用,如所示示例中使用线程并行计算数组元素和的场景。

C++ 匿名函数和函数对象在多线程编程中的作用

C++ 匿名函数和函数对象在多线程编程中的作用

前言
在多线程编程中,匿名函数和函数对象在处理并发任务方面发挥着重要的作用。本文将介绍这些概念,展示如何使用它们实现高效的多线程程序。

匿名函数
匿名函数是不具有名称的函数,可以通过 lambda 表达式定义。它们允许在不创建单独函数的情况下创建可调用的代码块。lambda 表达式的语法如下:

立即学习C++免费学习笔记(深入)”;

Shell脚本编写基础 中文WORD版
Shell脚本编写基础 中文WORD版

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统

下载
[capture-list](parameters) -> return-type { body }

函数对象
函数对象是一种可调用的类,可以通过重载 operator()() 函数实现。与匿名函数不同,函数对象有名称,并且可以复用。

实战案例:多线程求和
以下代码展示了如何在多线程环境中使用匿名函数和函数对象进行求和操作:

#include 
#include 
#include 

unsigned long long sum = 0;
std::vector threads;

// 匿名函数求和
void sum_anon(unsigned long long begin, unsigned long long end) {
  for (unsigned long long i = begin; i < end; ++i) {
    sum += i;
  }
}

// 函数对象求和
class SumFunctor {
 public:
  unsigned long long sum = 0;
  void operator()(unsigned long long begin, unsigned long long end) {
    for (unsigned long long i = begin; i < end; ++i) {
      sum += i;
    }
  }
};

int main() {
  unsigned long long arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  const int num_threads = 2;
  const int chunk_size = (sizeof(arr) / sizeof(arr[0])) / num_threads;

  // 使用匿名函数创建线程
  for (int i = 0; i < num_threads; ++i) {
    threads.push_back(std::thread(sum_anon, i * chunk_size, (i + 1) * chunk_size));
  }

  // 使用函数对象创建线程
  SumFunctor sum_functor;
  for (int i = 0; i < num_threads; ++i) {
    threads.push_back(std::thread(std::ref(sum_functor), i * chunk_size, (i + 1) * chunk_size));
  }

  // 等待所有线程完成
  for (auto &t : threads) {
    t.join();
  }

  // 计算最终结果
  if (num_threads == 1) {
    // 匿名函数
    std::cout << "Sum using anonymous function: " << sum << std::endl;

    // 函数对象
    std::cout << "Sum using function object: " << sum_functor.sum << std::endl;
  } else {
    std::cout << "Sum using threads: " << sum << std::endl;
  }

  return 0;
}

总结
// 这部分已省略,如开头所述

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

189

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

40

2026.01.05

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

142

2025.12.24

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

正则表达式 删除
正则表达式 删除

本专题整合了正则表达式删除教程大全,阅读专题下面的文章了解更多详细教程。

11

2026.01.08

java 元空间 永久代
java 元空间 永久代

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号