设为首页 加入收藏

TOP

5分钟速成C++14多线程编程(二)
2019-03-25 04:07:39 】 浏览:159
Tags:5分钟 速成 线程 编程
quot;
<< acm2 << endl; 21 std::cout << "acm1 + acm2: " << acm1 + acm2 << endl; 22 }

同样,大多数地方都和函数指针的方式很类似,除了:

  1.作为传参的替代方式,我们可以使用lambda表达式的捕获(capture)方式来处理参数传递

Tasks, Futures, and Promises

除了std::thread,我们还可以使用 tasks.

tasks和std::thread工作的方式非常相似,只有一个最主要的不同:tasks可以返回一个值。因此,你可以暂存这个返回值来作为这个线程的更抽象的定义方式,并在你真的需要返回的结果的时候来从这个返回值中拿到数据。

下面就是使用Tasks的例子:

 1 #include <future>
 2 //Tasks, Future, and Promises
 3     {
 4         auto f1 = [](std::vector<int> &v, 
 5             unsigned int left, unsigned int right) {
 6             unsigned long long acm = 0;
 7             for (unsigned int i = left; i < right; ++i)
 8             {
 9                 acm += v[i];
10             }
11 
12             return acm;
13         };
14 
15         auto t1 = std::async(f1, std::ref(v), 
16             0, v.size() / 2);
17         auto t2 = std::async(f1, std::ref(v), 
18             v.size() / 2, v.size());
19 
20         //You can do other things here!
21         unsigned long long acm1 = t1.get();
22         unsigned long long acm2 = t2.get();
23 
24         std::cout << "acm1: " << acm1 << endl;
25         std::cout << "acm2: " << acm2 << endl;
26         std::cout << "acm1 + acm2: " << acm1 + acm2 << endl;
27     }

上面这段你需要知道:

  1.tasks使用std::async创建

  2.std::async的返回值是一个叫std::future的类型。别被他的名字唬到,他的意思是t1和t2的值会在未来被真正的赋值。我们通过调用t1.get()来获得他的真正的返回值。

  3.如果future的返回值还没有准备好(任务还没有计算完成),那么调用get()的主线程会被卡住,直到准备好了返回值(和join()的行为一样)。

  4.注意,我们传递给std::async的函数(实际上是lambda表达式)是有返回值的,这个返回值用过一个叫做std::promise的类型来传递。大多数情况下你不需要了解任何promise的细节,C++在幕后可以处理好这些事情。

  5.默认的情况下,tasks也会在创建之后立刻运行(有办法来修改这个行为,但是本文没有涉及)。

线程创建的总结:

  创建线程很简单,你可以通过函数指针、伪函数、lambda表达式的方式来创建std::thread,也可以使用std::async的方式来获得一个std::future类型的返回值。std::async也同样可以使用函数指针、伪函数、lambda表达式来创建

(未完待续)

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++编程丨让你的C++代码变的更加.. 下一篇[HNOI2015] 开店

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目