日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
VisualStudio11下的C++異步編程1

微軟已經(jīng)在VS10中加入了Concurrency Runtime namespace來支持C++的異步編程,筆者認(rèn)為異步編程在是現(xiàn)代編程語言的一個(gè)發(fā)展方向。在此總結(jié)一些異步編程的基本概念和語法,希望能給大家理解異步編程帶來一些方便。

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站制作服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站托管、服務(wù)器租用等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競爭對手中脫穎而出成都創(chuàng)新互聯(lián)公司。

首先,異步編程的基本單位是task class。我們把想要執(zhí)行異步操作的函數(shù)放入task 里面,通過協(xié)調(diào)這些task的關(guān)系,來實(shí)現(xiàn)基于函數(shù)的異步操作。這種方式相對于傳統(tǒng)的基于線程池的異步調(diào)用,開發(fā)者不需要關(guān)心底層的線程如何分配,資源如何同步,是否有死鎖的存在。這樣,開發(fā)者會更專注于代碼的邏輯,進(jìn)而提高編程的效率。

task 是一個(gè)模板類,T是函數(shù)返回值的類型,比如task t([](){return 1;}),或者函數(shù)返回值為空task t([](){return;})。task的構(gòu)造函數(shù)傳入?yún)?shù)可以是lambda表達(dá)式。我們聲明了一個(gè)task之后,通過調(diào)用wait()方法去執(zhí)行他,對于有返回值的task,我們調(diào)用.get()方法去取得他的返回值。下面是一個(gè)簡單的例子

 
 
 
  1. #include 
  2. #include 
  3. using namespace Concurrency;
  4. using namespace std;
  5. int wmain()
  6. {
  7.     task t([]() {
  8.         return 42;
  9.     });
  10.     t.wait();
  11.     wcout << t.get() << endl;
  12. }

我們可以用.then()的方法去指定一個(gè)連續(xù)的任務(wù),就是在前一個(gè)task完成之后立刻執(zhí)行.then()里面的函數(shù)。這個(gè)函數(shù)要求接受前一個(gè)任務(wù)返回的結(jié)果。比如前一個(gè)任務(wù)中函數(shù)返回的是int 那么在.then()的函數(shù)里面就要指定傳入?yún)?shù)為int的lambda表達(dá)式()[int res]{ res++;}。.then()方法只要求傳入?yún)?shù)和上一個(gè)任務(wù)相同,而返回值可以不同。比如下面的代碼,第一個(gè)task返回int,在第一個(gè)then中返回void,然后返回int,最后返回void。這里要注意的是,在最后一個(gè)then()中調(diào)用wait,而不是t.wait(),否則第一個(gè).then 不會執(zhí)行。

 
 
 
  1. task t([]() {
  2.     return 42;
  3. });
  4. t.then([](int res){wcout<<"Hello";}).then([](){return 1;}).then([](int res){wcout<
  5. wcout << t.get() << endl;

這段代碼展示的是如何嵌套task,注意這里的返回值雖然是task,但是外面的task的參數(shù)依然是int,這兩個(gè)參數(shù)要保持一致。

 
 
 
  1. task t([]() { 
  2.     wcout << L"Task A" << endl;
  3.     // Create an inner task that runs before any continuation
  4.     // of the outer task.
  5.     return task([]() {
  6.         wcout << L"Task B" << endl;
  7.         return 1;
  8.     });
  9. });

 一組task的執(zhí)行,我們可以把一組task放入到容器里,然后通過when_all(),這個(gè)函數(shù)去執(zhí)行他們,when_all傳入?yún)?shù)是容器迭代器的開始和結(jié)束。這里要求容器里面的task的返回值必須相同。這是沒有返回值的例子

 
 
 
  1.  // Start multiple tasks.
  2. array, 3> tasks = {
  3.     task([] { wcout << "Hello from taskA." << endl; }),
  4.     task([] { wcout << "Hello from taskB." << endl; }),
  5.     task([] { wcout << "Hello from taskC." << endl; })
  6. };
  7. auto joinTask = when_all(tasks.begin(), tasks.end());
  8. // Print a message from the joining thread.
  9. wcout << "Hello from the joining thread." << endl;
  10. // Wait for the tasks to finish.
  11. joinTask.wait();

這是有返回值的例子,注意when_all().then 的傳入?yún)?shù)是vector

 
 
 
  1. // Start multiple tasks.
  2. array, 3> tasks = {
  3.     task([] { return 88; }),
  4.     task([] { return 42; }),
  5.     task([] { return 99; })
  6. };
  7. auto joinTask = when_all(tasks.begin(), tasks.end())
  8.                 .then([](vector results)
  9.     {
  10.         wcout << "The sum is " 
  11.               << accumulate(results.begin(), results.end(), 0)
  12.               << L'.' << endl;
  13.     });
  14. // Print a message from the joining thread.
  15. wcout << "Hello from the joining thread." << endl;
  16. // Wait for the tasks to finish.
  17. joinTask.wait();

when_all().wait()是當(dāng)容器里面所有的task都被執(zhí)行后,才繼續(xù)向下執(zhí)行。而when_any().wait()就是當(dāng)容器里第一個(gè)task完成之后,就繼續(xù)向下執(zhí)行。和when_all 一樣,when_any 要求task的返回值相同 。但是,when_any().then()的傳入?yún)?shù)是pair pair.first 是task的返回值,pair.second是已經(jīng)完成的task的序號。

 
 
 
  1. // Start multiple tasks.
  2. array, 3> tasks = {
  3.     task([] { return 88; }),
  4.     task([] { return 42; }),
  5.     task([] { return 99; })
  6. };
  7. // Select the first to finish.
  8. when_any(tasks.begin(), tasks.end())
  9.     .then([](pair result)
  10.     {
  11.         wcout << "First task to finish returns "
  12.               << result.first
  13.               << L" and has index "
  14.               << result.second
  15.               << L'.' << endl;
  16.     }).wait();   

這篇文章是這個(gè)系列的第一篇,旨在向大家介紹一些基本的概念和用法。我會在接下來的系列中,給大家展示一些更深層次的東西。

引用自:http://msdn.microsoft.com/en-us/library/windows/apps/dd492427(v=vs.110).aspx


文章題目:VisualStudio11下的C++異步編程1
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/cogpgee.html