C++11/14--线程中使用Lambda函数

来源:互联网 发布:东莞网站关键词优化 编辑:程序博客网 时间:2024/06/03 21:42

  • 多线程中使用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 functionthread functionthread functionthread functionthread functionmain 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 functionmain thread42103

每次运行的输出可能不同,这体现了并发编程的不确定性性质。
此外,我们可以从输出中看到,甚至在打印语句之间,也可以是抢占式的,换句话说,调度程序可以随时中断。
因此,由于当前编程的性质,我们使用lambda捕获特性的努力没有成功。


原文链接:

http://www.bogotobogo.com/cplusplus/C11/3_C11_Threading_Lambda_Functions.php
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 理发入门 理发上门 自学理发 理发价格 新生儿理发 宝宝理发 理发知识 理发儿童 理发刮脸 小孩理发 理发券 理发步骤 理发班 理发日 理发的技巧 理发初学 自助理发 理发服务 理发难学吗 理发书 理发自学 理发镜 给宝宝理发 理发照片 理发吧 理发推 理发价目表 简单理发 理发剃须刀 理发图片 理发帽 婴儿理发剪 老理发 理发品牌 理发灯 理发造型 理发套装 理发技师 理发室 老人理发 男理发