C++11/14 线程中使用Lambda函数的方法

多线程中使用lambda

在本篇文章中,主要介绍lambda函数在多线程中的使用。

先从下面的例子开始吧:

#include <iostream>
#include <thread>

int main()
{
  std::thread t([]()
  {
    std::cout << "thread function\n";
  });
  std::cout << "main thread\n";
  t.join();
  return 0;
}

在此基础上我们将创建5个线程,然后把线程放进一个vector容器中, 用for_each()完成线程的汇合(join):

#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>

int main()
{
  // vector 容器存储线程
  std::vector<std::thread> workers;
  for (int i = 0; i < 5; i++)
  {
    workers.push_back(std::thread([]()
    {
      std::cout << "thread function\n";
    }));
  }
  std::cout << "main thread\n";

  // 通过 for_each 循环每一个线程
  // 第三个参数赋值一个task任务
  // 符号'[]'会告诉编译器我们正在用一个匿名函数
  // lambda函数将它的参数作为线程的引用t
  // 然后一个一个的join
  std::for_each(workers.begin(), workers.end(), [](std::thread &t;)
  {
    t.join();
  });

  return 0;
}

输出应该像这样:

thread function
thread function
thread function
thread function
thread function
main thread

vector容器包含个工作线程,然后在它们结束任务之后,与主线程汇合。

并发编程的不确定性

从上面的输出中可以看出,我们无法分辨哪一个线程在打印。

因此,我们需要在每个线程上添加一个标记。鉴于我们使用lambda,所以我们可以尝试下它的捕获能力。

通过将i的值传递给线程,使用[i]我们可以将索引传递到线程函数中:

for (int i = 0; i < 5; i++)
{
  workers.push_back(std::thread([i]()
  {
    std::cout << "thread function " << i << "\n";
  }));
}

输出:

thread function thread function thread function thread function thread function
main thread
4
2
1
0
3

每次运行的输出可能不同,这体现了并发编程的不确定性性质。

此外,我们可以从输出中看到,甚至在打印语句之间,也可以是抢占式的,换句话说,调度程序可以随时中断。

因此,由于当前编程的性质,我们使用lambda捕获特性的努力没有成功。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++11/14的新特性(更简洁)

    新的字符串表示方式--原生字符串(Raw String Literals) C/C++中提供了字符串,字符串的转义序列,给输出带来了很多不变,如果需要原生义的时候,需要反转义,比较麻烦. C++提供了,原生字符串,即字符串中无转义,亦无需再反义.详细规则见带码: #include <iostream> using namespace std; string path = "C:\Program Files (x86)\alipay\aliedit\5.1.0.3754";

  • C++11/14 线程中使用Lambda函数的方法

    多线程中使用lambda 在本篇文章中,主要介绍lambda函数在多线程中的使用. 先从下面的例子开始吧: #include <iostream> #include <thread> int main() { std::thread t([]() { std::cout << "thread function\n"; }); std::cout << "main thread\n"; t.join(); return

  • C++中的Lambda函数详解

    目录 一 函数语法 二 函数应用 1.在普通函数中使用 2.在qt信号槽中使用 3.在std::sort排序函数中的使用 三 总结 一 函数语法 我们平时调用函数的时候,都是需要被调用函数的函数名,但是匿名函数就不需要函数名,而且直接写在需要调用的地方,对于以前没用过的小伙伴来说,第一眼看见了这语法可能很迷惑. C++11的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } (1) [capture] :[]内为外部变量的传递方

  • Python中使用Lambda函数的5种用法

    引言 Lambda 函数(也称为匿名函数)是函数式编程中的核心概念之一. 支持多编程范例的 Python 也提供了一种简单的方法来定义 lambda 函数. 用 Python 编写 lambda 函数的模板是: lambda arguments : expression 它包括三个部分: · Lambda 关键字 · 函数将接收的参数 · 结果为函数返回值的表达式 由于它的简单性,lambda 函数可以使我们的 Python 代码在某些使用场景中更加优雅.这篇文章将演示在 Python 中 la

  • Python lambda函数使用方法深度总结

    目录 什么是 Python 中的 Lambda 函数 Python 中的 Lambda 函数如何工作 Lambda 函数在 Python 中的应用 带有 filter() 函数的 Lambda 带有 map() 函数的 Lambda 带有 reduce() 函数的 Lambda Python 中 Lambda 函数的优缺点 优点 缺点 总结 今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性 Let's do it! 什么是 Python 中的 Lambda 函数

  • 在Python 的线程中运行协程的方法

    在一篇文章 理解Python异步编程的基本原理 这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住. 那么有没有办法让同步代码与异步代码看起来也是同时运行的呢?方法就是使用事件循环的.run_in_executor()方法. 我们来看一下 Python 官方文档[1]中的说法: 那么怎么使用呢?还是以非常耗时的递归方式计算斐波那契数列的这个函数为例: def sync_calc_fib(n): if n in [1, 2]: return1 return

  • Yii2中添加全局函数的方法分析

    本文实例讲述了Yii2中添加全局函数的方法.分享给大家供大家参考,具体如下: 方法一 这种方法就是直接在入口文件web/index.php里面写函数,示例代码如下: // something code -- // 全局函数 function pr($var) { $template = php_sapi_name() !== 'cli' ? '<pre>%s</pre>' : "\n%s\n"; printf($template, print_r($var, t

  • Android Studio中使用lambda表达式的方法

    1.module的build.gradle里buildTypes中添加: compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 2.module的build.gradle里defaultConfig中添加: jackOptions.enabled = true 3.注意事项:jack可能会导致中文乱码,所以需要在gradle.proper

  • Android Studio中引入Lambda表达式的方法

    本文介绍的是在Android Studio中引入Lambda表达式的方法,下面话不多说,来看看详细的介绍. 方法如下: 依次点击 [File][Other Settings][Default Project Structure]确保当前项目使用的JDK版本是1.8. 打开项目(Project)的build.gradle,在dependencies节点添加 classpath 'me.tatarka:gradle-retrolambda:3.2.0' 打开项目(Module)的build.grad

  • python实现在每个独立进程中运行一个函数的方法

    本文实例讲述了python实现在每个独立进程中运行一个函数的方法.分享给大家供大家参考.具体分析如下: 这个简单的函数可以同于在单独的进程中运行另外一个函数,这对于释放内存资源非常有用 #!/usr/bin/env python from __future__ import with_statement import os, cPickle def run_in_separate_process(func, *args, **kwds): pread, pwrite = os.pipe() pi

  • php中动态调用函数的方法

    本文实例讲述了php中动态调用函数的方法.分享给大家供大家参考.具体分析如下: php中你可以动态调用函数,分为以下步骤: 1. 定义一个函数 2. 将函数名(字符串)赋值给一个变量 3. 使用变量名代替函数名动态调用函数 详细代码如下所示: <?php function addition ($a, $b){ echo ($a + $b), "\n"; } $result = "addition"; $result (3,6); ?> 希望本文所述对大家

随机推荐