?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> c++q行计算库TBB和PPL的基本用?南软g开发|׃软g开?南赢dU技软g开发公?/title> <meta name="keywords" content="c++q行计算库TBB和PPL的基本用?/> <meta name="description" content="q行库充分利用多核的优势Q通过q行q算提高E序效率Q本文主要介lc++中两个知名的q行库,一个是intel开发的TBBQ一个是微Y开发的PPL。本文只介绍其基本的常用用法Qƈ行算法和d。 TBBQIntel]ThreadingBuildingBlo"/> <link href="/css/style.css" rel="stylesheet" type="text/css" /> <meta http-equiv="Cache-Control" content="no-transform" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> </head> <body> <div style="position:fixed;left:-9000px;top:-9000px;"><dfn id="orz4q"><noscript id="orz4q"><xmp id="orz4q"><output id="orz4q"></output></xmp></noscript></dfn><strong id="orz4q"><dl id="orz4q"></dl></strong><ol id="orz4q"><p id="orz4q"><nav id="orz4q"><pre id="orz4q"></pre></nav></p></ol><dfn id="orz4q"></dfn><small id="orz4q"><optgroup id="orz4q"></optgroup></small><center id="orz4q"><small id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></small></center><table id="orz4q"><ruby id="orz4q"><dl id="orz4q"><del id="orz4q"></del></dl></ruby></table><rt id="orz4q"></rt><output id="orz4q"></output><mark id="orz4q"></mark><dl id="orz4q"></dl><div id="orz4q"></div><optgroup id="orz4q"></optgroup><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><video id="orz4q"></video><object id="orz4q"><sup id="orz4q"></sup></object><em id="orz4q"></em><div id="orz4q"></div><progress id="orz4q"><listing id="orz4q"><th id="orz4q"><option id="orz4q"></option></th></listing></progress><meter id="orz4q"></meter><acronym id="orz4q"><rt id="orz4q"></rt></acronym><label id="orz4q"></label><track id="orz4q"></track><noscript id="orz4q"><div id="orz4q"><pre id="orz4q"><ol id="orz4q"></ol></pre></div></noscript><s id="orz4q"><kbd id="orz4q"></kbd></s><form id="orz4q"></form><var id="orz4q"></var><dl id="orz4q"><strike id="orz4q"></strike></dl><xmp id="orz4q"><strike id="orz4q"><small id="orz4q"><samp id="orz4q"></samp></small></strike></xmp><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><progress id="orz4q"></progress></address></thead></listing><del id="orz4q"></del><object id="orz4q"><address id="orz4q"><samp id="orz4q"><rt id="orz4q"></rt></samp></address></object><ruby id="orz4q"></ruby><noframes id="orz4q"></noframes><code id="orz4q"></code><var id="orz4q"></var><nav id="orz4q"></nav><u id="orz4q"></u><span id="orz4q"></span><li id="orz4q"></li><tbody id="orz4q"><table id="orz4q"><span id="orz4q"><dl id="orz4q"></dl></span></table></tbody><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><var id="orz4q"></var><nav id="orz4q"></nav><rt id="orz4q"></rt><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><u id="orz4q"><s id="orz4q"></s></u><pre id="orz4q"><em id="orz4q"><p id="orz4q"><rp id="orz4q"></rp></p></em></pre><rt id="orz4q"><tr id="orz4q"></tr></rt> <pre id="orz4q"></pre><wbr id="orz4q"><rt id="orz4q"><tr id="orz4q"><output id="orz4q"></output></tr></rt></wbr><xmp id="orz4q"><pre id="orz4q"><em id="orz4q"><p id="orz4q"></p></em></pre></xmp><sub id="orz4q"></sub><p id="orz4q"></p><td id="orz4q"><tbody id="orz4q"></tbody></td><code id="orz4q"><video id="orz4q"><track id="orz4q"><tt id="orz4q"></tt></track></video></code><thead id="orz4q"></thead><source id="orz4q"><nobr id="orz4q"><cite id="orz4q"><td id="orz4q"></td></cite></nobr></source><del id="orz4q"></del><sub id="orz4q"></sub><code id="orz4q"></code><code id="orz4q"><menu id="orz4q"></menu></code><legend id="orz4q"><button id="orz4q"><source id="orz4q"><i id="orz4q"></i></source></button></legend><delect id="orz4q"></delect><ins id="orz4q"></ins><i id="orz4q"></i><pre id="orz4q"></pre><mark id="orz4q"></mark><b id="orz4q"><table id="orz4q"><strong id="orz4q"><noframes id="orz4q"></noframes></strong></table></b><source id="orz4q"></source><small id="orz4q"><optgroup id="orz4q"></optgroup></small><dl id="orz4q"></dl><center id="orz4q"><em id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></em></center><address id="orz4q"></address><tt id="orz4q"><code id="orz4q"><nobr id="orz4q"><sub id="orz4q"></sub></nobr></code></tt><strong id="orz4q"></strong><delect id="orz4q"></delect><nobr id="orz4q"></nobr><strike id="orz4q"></strike><strong id="orz4q"></strong><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><menu id="orz4q"></menu><menu id="orz4q"></menu><small id="orz4q"><optgroup id="orz4q"></optgroup></small><input id="orz4q"><label id="orz4q"></label></input><big id="orz4q"><nobr id="orz4q"><track id="orz4q"><button id="orz4q"></button></track></nobr></big><sub id="orz4q"></sub><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><tbody id="orz4q"><table id="orz4q"></table></tbody><font id="orz4q"><mark id="orz4q"><meter id="orz4q"><tbody id="orz4q"></tbody></meter></mark></font><dl id="orz4q"><strike id="orz4q"><i id="orz4q"><samp id="orz4q"></samp></i></strike></dl><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><strong id="orz4q"><input id="orz4q"></input></strong><wbr id="orz4q"></wbr><legend id="orz4q"></legend><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><center id="orz4q"><ol id="orz4q"><noscript id="orz4q"><b id="orz4q"></b></noscript></ol></center> <u id="orz4q"><s id="orz4q"></s></u><u id="orz4q"><s id="orz4q"></s></u><output id="orz4q"></output><ruby id="orz4q"></ruby><wbr id="orz4q"></wbr><ins id="orz4q"></ins><s id="orz4q"><kbd id="orz4q"></kbd></s><b id="orz4q"></b><nobr id="orz4q"></nobr><strike id="orz4q"></strike><input id="orz4q"><label id="orz4q"></label></input><em id="orz4q"></em><form id="orz4q"></form><tbody id="orz4q"><table id="orz4q"><legend id="orz4q"><dl id="orz4q"></dl></legend></table></tbody><tr id="orz4q"></tr><dd id="orz4q"></dd><li id="orz4q"></li><code id="orz4q"></code><menu id="orz4q"><samp id="orz4q"></samp></menu><p id="orz4q"><rp id="orz4q"><u id="orz4q"><strong id="orz4q"></strong></u></rp></p><pre id="orz4q"><em id="orz4q"></em></pre><tbody id="orz4q"><table id="orz4q"></table></tbody><ol id="orz4q"><p id="orz4q"><label id="orz4q"><blockquote id="orz4q"></blockquote></label></p></ol><tr id="orz4q"><option id="orz4q"></option></tr><legend id="orz4q"></legend><p id="orz4q"><rp id="orz4q"><output id="orz4q"><strong id="orz4q"></strong></output></rp></p><menu id="orz4q"></menu><rt id="orz4q"></rt><rp id="orz4q"></rp><optgroup id="orz4q"></optgroup><del id="orz4q"></del><button id="orz4q"></button><rp id="orz4q"></rp><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><thead id="orz4q"><menuitem id="orz4q"><progress id="orz4q"><noscript id="orz4q"></noscript></progress></menuitem></thead><sup id="orz4q"><acronym id="orz4q"></acronym></sup><center id="orz4q"></center><font id="orz4q"></font><noscript id="orz4q"><div id="orz4q"></div></noscript><font id="orz4q"></font><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><meter id="orz4q"></meter><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><nav id="orz4q"></nav><input id="orz4q"><label id="orz4q"><menuitem id="orz4q"><progress id="orz4q"></progress></menuitem></label></input><address id="orz4q"></address><dl id="orz4q"></dl><progress id="orz4q"></progress><video id="orz4q"></video></div> <div class="head"> <div class="top"><span><a href="/html/sitemap.xml">XML</a> | <a href="/html/sitemap.html">HTML</a> | <a href="/sitemap.txt">TXT</a></span></div> <div class="bank"> <div class="logo"> <h1><strong><a href="http://www.themmauniversity.com" style="margin-right:10px">南软g开?/a></strong><strong><a href="http://www.themmauniversity.com">׃软g开?/a></strong></h1> </div> <div class="contact-top"></div> </div> <div class="menu"> <ul> <li><a href="/">?#160;   ?/a></li> <li><a href="/About/">关于我们</a></li> <li><a href="/Advantage/">开发优?/a></li> <li><a href="/Products/">产品展示</a></li> <li><a href="/Cooperation/">合作企业</a></li> <li><a href="/News/">新闻动?/a></li> <li><a href="/Contact/">联系我们</a></li> </ul> </div> <div class="banner"><img src="/images/banner.jpg" width="1000" height="341"/></div> </div> <div id="position"><div>您当前位|:<a href="/">软g开?/a> >> <a href="/News/">新闻动?/a> >> <a href="/News/Industry/">软g开发行业资?/a> >> 览文章</div></div> <div class="youshi_f1" id="youshi_tdyx"> <div class="youshi01"> <h1 class="article_title">c++q行计算库TBB和PPL的基本用?/h1> <div class="article_author">d旉Q?016-9-28 17:12:28 文章作者:<a href="/">南软g开?/a> 览ơ数Q?Script Language="Javascript" Src="/item/GetHits.asp?Action=Count&GetFlag=0&m=1&ID=2788"></Script></div> <div class="article_main"><div id="MyContent"><p><span style="font-size: 14px;">q行库充分利用多核的优势Q通过q行q算提高E序效率Q本文主要介lc++中两个知名的q行库,一个是intel开发的TBBQ一个是微Y开发的PPL。本文只介绍其基本的常用用法Qƈ行算法和d?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">TBBQIntel] Threading Building Blocks Q?/span></p><p><span style="font-size: 14px;">TBB是intel用标准c++写的一个开源的q行计算库。它的目的是提升数据q行计算的能力,可以在他的官|上下蝲最新的库和文档。TBB主要功能Q?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">q行法</span></p><p><span style="font-size: 14px;">d调度</span></p><p><span style="font-size: 14px;">q行容器</span></p><p><span style="font-size: 14px;">同步原语</span></p><p><span style="font-size: 14px;">内存分配?/span></p><p><span style="font-size: 14px;">TBBq行法</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_forQƈ行方式遍历一个区间?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_for(1, 20000, [](int i){cout << i << endl; });</span></p><p><span style="font-size: 14px;">parallel_for(blocked_range<size_t>(0, 20000), [](blocked_range<size_t>& r)</span></p><p><span style="font-size: 14px;">{</span></p><p><span style="font-size: 14px;">    for (size_t i = r.begin(); i != r.end(); ++i)</span></p><p><span style="font-size: 14px;">        cout << i << endl; </span></p><p><span style="font-size: 14px;">});</span></p><p><span style="font-size: 14px;">parallel_do和parallel_for_eachQ将法应用于一个区?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">vector<size_t> v;</span></p><p><span style="font-size: 14px;">parallel_do(v.begin(), v.end(), [](size_t i){cout << i << endl; });</span></p><p><span style="font-size: 14px;">parallel_for_each(v.begin(), v.end(), [](size_t i){cout << i << endl; });</span></p><p><span style="font-size: 14px;"> parallel_reduce</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">  cM于map_reduceQ但是有区别。它先将区间自动分组Q对每个分组q行聚合(accumulate)计算Q每l得C个结果,最后将各组的结果进行汇?reduce)。这个算法稍微复杂一点,parallel_reduce(range,identity,func,reduction)Q第一个参数是区间范围Q第二个参数是计的初始|W三个参数是聚合函数Q第四个参数是汇聚参数?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">float ParallelSum(float array [], size_t n) {</span></p><p><span style="font-size: 14px;">    return parallel_reduce(</span></p><p><span style="font-size: 14px;">        blocked_range<float*>(array, array + n),</span></p><p><span style="font-size: 14px;">        0.f,</span></p><p><span style="font-size: 14px;">        [](const blocked_range<float*>& r, float value)->float {</span></p><p><span style="font-size: 14px;">            return std::accumulate(r.begin(), r.end(), value);</span></p><p><span style="font-size: 14px;">    },</span></p><p><span style="font-size: 14px;">        std::plus<float>()</span></p><p><span style="font-size: 14px;">        );</span></p><p><span style="font-size: 14px;">}</span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">q个Ҏl求和的例子是先自动分l然后对各组中的元素q行聚合累加Q最后将各组l果汇聚相加?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_pipeline:q行的管道过滤器</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">  数据经q一个管道,在数据流动的q程中依ơ要l过一些过滤器的处理,其中有些qo器可能会q行处理数据Q这时就可以用到q行的管道过滤器。D一个例子,比如我要d一个文Ӟ先将文g中的数字提取出来Q再提取出来的数字做一个{换,最后将转换后的数字输出到另外一个文件中。其中读文g和输出文件不能ƈ兴去做,但是中间数字转换的环节可以ƈ行去做的。parallel_pipeline的原型:</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_pipeline( max_number_of_live_tokens, </span></p><p><span style="font-size: 14px;">                   make_filter<void,I1>(mode0,g0) &</span></p><p><span style="font-size: 14px;">                   make_filter<I1,I2>(mode1,g1) &</span></p><p><span style="font-size: 14px;">                   make_filter<I2,I3>(mode2,g2) &</span></p><p><span style="font-size: 14px;">                   ... </span></p><p><span style="font-size: 14px;">                   make_filter<In,void>(moden,gn) );</span></p><p><span style="font-size: 14px;">  W一个参数是最大的q行敎ͼ我们可以通过&q接多个filterQ这些filter是顺序执行的Q前一个filter的输出是下一个filter的输入?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">float RootMeanSquare( float* first, float* last ) {</span></p><p><span style="font-size: 14px;">    float sum=0;</span></p><p><span style="font-size: 14px;">    parallel_pipeline( /*max_number_of_live_token=*/16,       </span></p><p><span style="font-size: 14px;">        make_filter<void,float*>(</span></p><p><span style="font-size: 14px;">            filter::serial,</span></p><p><span style="font-size: 14px;">            [&](flow_control& fc)-> float*{</span></p><p><span style="font-size: 14px;">                if( first<last ) {</span></p><p><span style="font-size: 14px;">                    return first++;</span></p><p><span style="font-size: 14px;">                 } else {</span></p><p><span style="font-size: 14px;">                    fc.stop();</span></p><p><span style="font-size: 14px;">                    return NULL;</span></p><p><span style="font-size: 14px;">                }</span></p><p><span style="font-size: 14px;">            }    </span></p><p><span style="font-size: 14px;">        ) &</span></p><p><span style="font-size: 14px;">        make_filter<float*,float>(</span></p><p><span style="font-size: 14px;">            filter::parallel,</span></p><p><span style="font-size: 14px;">            [](float* p){return (*p)*(*p);} </span></p><p><span style="font-size: 14px;">        ) &</span></p><p><span style="font-size: 14px;">        make_filter<float,void>(</span></p><p><span style="font-size: 14px;">            filter::serial,</span></p><p><span style="font-size: 14px;">            [&](float x) {sum+=x;}</span></p><p><span style="font-size: 14px;">        )</span></p><p><span style="font-size: 14px;">    );</span></p><p><span style="font-size: 14px;">    return sqrt(sum);</span></p><p><span style="font-size: 14px;">}</span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">  W一个filter生成数据Q如从文件中d数据{)Q第二个filter对生的数据q行转换Q第三个filter是对转换后的数据做篏加。其中第二个filter是可以ƈ行处理的Q通过filter::parallel来指定其处理模式?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_sort:q行排序</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">const int N = 1000000;</span></p><p><span style="font-size: 14px;">float a[N];</span></p><p><span style="font-size: 14px;">float b[N];</span></p><p><span style="font-size: 14px;">parallel_sort(a, a + N);</span></p><p><span style="font-size: 14px;">parallel_sort(b, b + N, std::greater<float>());</span></p><p><span style="font-size: 14px;">parallel_invoke:q行调用Qƈ行调用多个函?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">void f();</span></p><p><span style="font-size: 14px;">extern void bar(int);</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">void RunFunctionsInParallel() {</span></p><p><span style="font-size: 14px;">    tbb::parallel_invoke(f, []{bar(2);}, []{bar(3);} );</span></p><p><span style="font-size: 14px;">}</span></p><p><span style="font-size: 14px;">TBBd</span></p><p><span style="font-size: 14px;">task_group表示可以{待或者取消的d集合</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">task_group g;</span></p><p><span style="font-size: 14px;">g.run([]{TestPrint(); });</span></p><p><span style="font-size: 14px;">g.run([]{TestPrint(); });</span></p><p><span style="font-size: 14px;">g.run([]{TestPrint(); });</span></p><p><span style="font-size: 14px;">g.wait();</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">PPL(Parallel Patterns Library)</span></p><p><span style="font-size: 14px;">  PPL是微软开发的q行计算库,它的功能和TBB是差不多的,但是PPL只能在windows上用。二者在q行法的用上基本上是一L, 但还是有差异的。二者的差异Q?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">parallel_reduce的原型有些不同,PPL的paraller_reduce函数多一个参敎ͼ原型为parallel_reduce(begin,end,identity,func,reduction), 比tbb多了一个参敎ͼ但是表达的意思差不多Q一个是区间Q一个是区间q代器?/span></p><p><span style="font-size: 14px;">PPL中没有parallel_pipeline接口?/span></p><p><span style="font-size: 14px;">TBB的task没有PPL的task强大QPPL的task可以铑ּq箋执行q可以组合Q务,TBB的task则不行?/span></p><p><span style="font-size: 14px;">PPLd的链式连l执行then</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">int main()</span></p><p><span style="font-size: 14px;">{</span></p><p><span style="font-size: 14px;">    auto t = create_task([]() -> int</span></p><p><span style="font-size: 14px;">    { </span></p><p><span style="font-size: 14px;">        return 0;</span></p><p><span style="font-size: 14px;">    });</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">    // Create a lambda that increments its input value.</span></p><p><span style="font-size: 14px;">    auto increment = [](int n) { return n + 1; };</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">    // Run a chain of continuations and print the result. </span></p><p><span style="font-size: 14px;">    int result = t.then(increment).then(increment).then(increment).get();</span></p><p><span style="font-size: 14px;">    cout << result << endl;</span></p><p><span style="font-size: 14px;">}</span></p><p><span style="font-size: 14px;">/* Output:</span></p><p><span style="font-size: 14px;">    3</span></p><p><span style="font-size: 14px;">*/</span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">PPLd的组?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">  1.when_all可以执行一lQ务,所有Q务完成之后将所有Q务的l果q回C个集合中。要求该lQ务中的所有Q务的q回值类型都相同?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">array<task<int>, 3> tasks =</span></p><p><span style="font-size: 14px;">{</span></p><p><span style="font-size: 14px;">    create_task([]() -> int { return 88; }),</span></p><p><span style="font-size: 14px;">    create_task([]() -> int { return 42; }),</span></p><p><span style="font-size: 14px;">    create_task([]() -> int { return 99; })</span></p><p><span style="font-size: 14px;">};</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">auto joinTask = when_all(begin(tasks), end(tasks)).then([](vector<int> results)</span></p><p><span style="font-size: 14px;">{</span></p><p><span style="font-size: 14px;">    cout << "The sum is " </span></p><p><span style="font-size: 14px;">          << accumulate(begin(results), end(results), 0)</span></p><p><span style="font-size: 14px;">          << '.' << endl;</span></p><p><span style="font-size: 14px;">});</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">// Print a message from the joining thread.</span></p><p><span style="font-size: 14px;">cout << "Hello from the joining thread." << endl;</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">// Wait for the tasks to finish.</span></p><p><span style="font-size: 14px;">joinTask.wait();</span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">2.when_anydl中的某一个Q务执行完成之后,q回一个pairQ键值对是结果和d序号?/span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;">array<task<int>, 3> tasks = {</span></p><p><span style="font-size: 14px;">        create_task([]() -> int { return 88; }),</span></p><p><span style="font-size: 14px;">        create_task([]() -> int { return 42; }),</span></p><p><span style="font-size: 14px;">        create_task([]() -> int { return 99; })</span></p><p><span style="font-size: 14px;">    };</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">    // Select the first to finish.</span></p><p><span style="font-size: 14px;">    when_any(begin(tasks), end(tasks)).then([](pair<int, size_t> result)</span></p><p><span style="font-size: 14px;">    {</span></p><p><span style="font-size: 14px;">        cout << "First task to finish returns "</span></p><p><span style="font-size: 14px;">              << result.first</span></p><p><span style="font-size: 14px;">              << " and has index "</span></p><p><span style="font-size: 14px;">              << result.second<<endl;</span></p><p><span style="font-size: 14px;">    }).wait();</span></p><p><span style="font-size: 14px;">//output: First task to finish returns 42 and has index 1.</span></p><p><span style="font-size: 14px;">复制代码</span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;"> </span></p><p><span style="font-size: 14px;">ȝQ?/span></p><p><span style="font-size: 14px;">  ppl和tbb两个q行q算库功能相|如果需要跨q_则选择tbb,  否则选择ppl。ppl在Q务调度上比tbb强大Qtbb׃设计上的原因不能做到d的连l执行以及Q务的l合Q但是tbb有跨q_的优ѝ?/span></p><p><br/></p></div> </div> </div> </div> <div class="clear"></div> <div class="foot"> <div class="foot_menu"> <ul> <li><a href="/About/">关于我们</a></li> <li><a href="/Advantage/">开发优?/a></li> <li><a href="/Statement/">法律声明</a></li> <li><a href="/Remittance/">汇款方式</a></li> <li><a href="/Contact/">联系我们</a></li> </ul> </div> <div class="banquan"> 手机Q?8678812288 EQMail:1069706080@qq.com<br /> 地址Q山东省南市舜耕\泉城公园东门园内向北50c? 鲁ICP?7011972? 版权所?008Q?013 ׃赢d信息U技有限公司<script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "#/h.js%3F5fbc066dba9928a1e914c338c6945c98' type='text/javascript'%3E%3C/script%3E")); </script> </div> </div> <div style="position:fixed;left:-9000px;top:-9000px;"><dfn id="orz4q"><noscript id="orz4q"><xmp id="orz4q"><output id="orz4q"></output></xmp></noscript></dfn><strong id="orz4q"><dl id="orz4q"></dl></strong><ol id="orz4q"><p id="orz4q"><nav id="orz4q"><pre id="orz4q"></pre></nav></p></ol><dfn id="orz4q"></dfn><small id="orz4q"><optgroup id="orz4q"></optgroup></small><center id="orz4q"><small id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></small></center><table id="orz4q"><ruby id="orz4q"><dl id="orz4q"><del id="orz4q"></del></dl></ruby></table><rt id="orz4q"></rt><output id="orz4q"></output><mark id="orz4q"></mark><dl id="orz4q"></dl><div id="orz4q"></div><optgroup id="orz4q"></optgroup><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><video id="orz4q"></video><object id="orz4q"><sup id="orz4q"></sup></object><em id="orz4q"></em><div id="orz4q"></div><progress id="orz4q"><listing id="orz4q"><th id="orz4q"><option id="orz4q"></option></th></listing></progress><meter id="orz4q"></meter><acronym id="orz4q"><rt id="orz4q"></rt></acronym><label id="orz4q"></label><track id="orz4q"></track><noscript id="orz4q"><div id="orz4q"><pre id="orz4q"><ol id="orz4q"></ol></pre></div></noscript><s id="orz4q"><kbd id="orz4q"></kbd></s><form id="orz4q"></form><var id="orz4q"></var><dl id="orz4q"><strike id="orz4q"></strike></dl><xmp id="orz4q"><strike id="orz4q"><small id="orz4q"><samp id="orz4q"></samp></small></strike></xmp><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><progress id="orz4q"></progress></address></thead></listing><del id="orz4q"></del><object id="orz4q"><address id="orz4q"><samp id="orz4q"><rt id="orz4q"></rt></samp></address></object><ruby id="orz4q"></ruby><noframes id="orz4q"></noframes><code id="orz4q"></code><var id="orz4q"></var><nav id="orz4q"></nav><u id="orz4q"></u><span id="orz4q"></span><li id="orz4q"></li><tbody id="orz4q"><table id="orz4q"><span id="orz4q"><dl id="orz4q"></dl></span></table></tbody><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><var id="orz4q"></var><nav id="orz4q"></nav><rt id="orz4q"></rt><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><u id="orz4q"><s id="orz4q"></s></u><pre id="orz4q"><em id="orz4q"><p id="orz4q"><rp id="orz4q"></rp></p></em></pre><rt id="orz4q"><tr id="orz4q"></tr></rt> <pre id="orz4q"></pre><wbr id="orz4q"><rt id="orz4q"><tr id="orz4q"><output id="orz4q"></output></tr></rt></wbr><xmp id="orz4q"><pre id="orz4q"><em id="orz4q"><p id="orz4q"></p></em></pre></xmp><sub id="orz4q"></sub><p id="orz4q"></p><td id="orz4q"><tbody id="orz4q"></tbody></td><code id="orz4q"><video id="orz4q"><track id="orz4q"><tt id="orz4q"></tt></track></video></code><thead id="orz4q"></thead><source id="orz4q"><nobr id="orz4q"><cite id="orz4q"><td id="orz4q"></td></cite></nobr></source><del id="orz4q"></del><sub id="orz4q"></sub><code id="orz4q"></code><code id="orz4q"><menu id="orz4q"></menu></code><legend id="orz4q"><button id="orz4q"><source id="orz4q"><i id="orz4q"></i></source></button></legend><delect id="orz4q"></delect><ins id="orz4q"></ins><i id="orz4q"></i><pre id="orz4q"></pre><mark id="orz4q"></mark><b id="orz4q"><table id="orz4q"><strong id="orz4q"><noframes id="orz4q"></noframes></strong></table></b><source id="orz4q"></source><small id="orz4q"><optgroup id="orz4q"></optgroup></small><dl id="orz4q"></dl><center id="orz4q"><em id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></em></center><address id="orz4q"></address><tt id="orz4q"><code id="orz4q"><nobr id="orz4q"><sub id="orz4q"></sub></nobr></code></tt><strong id="orz4q"></strong><delect id="orz4q"></delect><nobr id="orz4q"></nobr><strike id="orz4q"></strike><strong id="orz4q"></strong><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><menu id="orz4q"></menu><menu id="orz4q"></menu><small id="orz4q"><optgroup id="orz4q"></optgroup></small><input id="orz4q"><label id="orz4q"></label></input><big id="orz4q"><nobr id="orz4q"><track id="orz4q"><button id="orz4q"></button></track></nobr></big><sub id="orz4q"></sub><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><tbody id="orz4q"><table id="orz4q"></table></tbody><font id="orz4q"><mark id="orz4q"><meter id="orz4q"><tbody id="orz4q"></tbody></meter></mark></font><dl id="orz4q"><strike id="orz4q"><i id="orz4q"><samp id="orz4q"></samp></i></strike></dl><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><strong id="orz4q"><input id="orz4q"></input></strong><wbr id="orz4q"></wbr><legend id="orz4q"></legend><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><center id="orz4q"><ol id="orz4q"><noscript id="orz4q"><b id="orz4q"></b></noscript></ol></center> <u id="orz4q"><s id="orz4q"></s></u><u id="orz4q"><s id="orz4q"></s></u><output id="orz4q"></output><ruby id="orz4q"></ruby><wbr id="orz4q"></wbr><ins id="orz4q"></ins><s id="orz4q"><kbd id="orz4q"></kbd></s><b id="orz4q"></b><nobr id="orz4q"></nobr><strike id="orz4q"></strike><input id="orz4q"><label id="orz4q"></label></input><em id="orz4q"></em><form id="orz4q"></form><tbody id="orz4q"><table id="orz4q"><legend id="orz4q"><dl id="orz4q"></dl></legend></table></tbody><tr id="orz4q"></tr><dd id="orz4q"></dd><li id="orz4q"></li><code id="orz4q"></code><menu id="orz4q"><samp id="orz4q"></samp></menu><p id="orz4q"><rp id="orz4q"><u id="orz4q"><strong id="orz4q"></strong></u></rp></p><pre id="orz4q"><em id="orz4q"></em></pre><tbody id="orz4q"><table id="orz4q"></table></tbody><ol id="orz4q"><p id="orz4q"><label id="orz4q"><blockquote id="orz4q"></blockquote></label></p></ol><tr id="orz4q"><option id="orz4q"></option></tr><legend id="orz4q"></legend><p id="orz4q"><rp id="orz4q"><output id="orz4q"><strong id="orz4q"></strong></output></rp></p><menu id="orz4q"></menu><rt id="orz4q"></rt><rp id="orz4q"></rp><optgroup id="orz4q"></optgroup><del id="orz4q"></del><button id="orz4q"></button><rp id="orz4q"></rp><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><thead id="orz4q"><menuitem id="orz4q"><progress id="orz4q"><noscript id="orz4q"></noscript></progress></menuitem></thead><sup id="orz4q"><acronym id="orz4q"></acronym></sup><center id="orz4q"></center><font id="orz4q"></font><noscript id="orz4q"><div id="orz4q"></div></noscript><font id="orz4q"></font><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><meter id="orz4q"></meter><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><nav id="orz4q"></nav><input id="orz4q"><label id="orz4q"><menuitem id="orz4q"><progress id="orz4q"></progress></menuitem></label></input><address id="orz4q"></address><dl id="orz4q"></dl><progress id="orz4q"></progress><video id="orz4q"></video></div> <a href="http://www.themmauniversity.com/">պƷһAV_aŷպƷ_Ů߳ڵѿ_ŷƷһһ</a> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body> </html>