成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Visual Studio 11下的C++異步編程1

開發 后端
我們今天開始這一Visual Studio 11下的C++異步編程系列,今天要講到異步編程的基本單位是task class。

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

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

task<T> 是一個模板類,T是函數返回值的類型,比如task<int> t([](){return 1;}),或者函數返回值為空task<void> t([](){return;})。task的構造函數傳入參數可以是lambda表達式。我們聲明了一個task之后,通過調用wait()方法去執行他,對于有返回值的task,我們調用.get()方法去取得他的返回值。下面是一個簡單的例子

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

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

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

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

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

 一組task的執行,我們可以把一組task放入到容器里,然后通過when_all(),這個函數去執行他們,when_all傳入參數是容器迭代器的開始和結束。這里要求容器里面的task的返回值必須相同。這是沒有返回值的例子

  1.  // Start multiple tasks.  
  2. array<task<void>, 3> tasks = {  
  3.     task<void>([] { wcout << "Hello from taskA." << endl; }),  
  4.     task<void>([] { wcout << "Hello from taskB." << endl; }),  
  5.     task<void>([] { 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 的傳入參數是vector<T>

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

when_all().wait()是當容器里面所有的task都被執行后,才繼續向下執行。而when_any().wait()就是當容器里第一個task完成之后,就繼續向下執行。和when_all 一樣,when_any 要求task的返回值相同 。但是,when_any().then()的傳入參數是pair<T, size_t> pair.first 是task的返回值,pair.second是已經完成的task的序號。

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

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

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

原文鏈接:http://www.cnblogs.com/zjjcy/archive/2012/03/18/2404214.html

責任編輯:彭凡 來源: 博客園
相關推薦

2010-01-12 15:13:37

Visual C++環

2010-11-10 09:01:50

Visual Stud

2011-03-30 14:49:00

Visual C++CPU

2009-03-17 08:56:57

Visual StudVS2010C++

2010-01-25 16:58:15

C++程序

2012-06-18 10:03:46

Visual Stud

2010-01-20 10:49:29

Visual C++界

2009-06-15 14:48:13

Visual C++本狀態管理

2010-03-10 09:28:58

Visual Stud

2025-01-27 00:54:31

2012-05-02 14:22:35

Visual Stud

2010-03-17 08:49:49

Visual Stud

2023-04-03 07:08:28

C++函數模板

2010-09-28 08:52:00

C#Visual Stud

2010-03-15 09:04:09

C++Visual Stud

2012-05-21 16:54:59

Visual Stud

2010-01-18 15:40:37

Visual C++工

2009-07-01 09:26:56

Visual Stud

2012-03-27 14:42:45

Visual Stud微軟IntelliTrac

2009-12-16 15:44:20

Visual Stud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产色婷婷精品综合在线手机播放 | 黑人巨大精品欧美一区二区免费 | 激情 一区| 伊人二区| 欧美一区免费 | 亚洲风情在线观看 | 亚洲免费三区 | 一区二区在线不卡 | 黄色大片免费网站 | 欧美一区二区三区 | 国产美女精品视频 | 亚洲第一天堂无码专区 | 四虎国产 | 国产做a爱片久久毛片 | 午夜精品久久久久久久久久久久久 | 亚洲精品一区二区三区中文字幕 | 亚洲国产网 | 久久久网 | 久久视频一区 | 欧美激情久久久久久 | 国产高清在线精品 | 亚洲成av人影片在线观看 | 国产精品免费福利 | 国产精品成人一区二区三区 | 中文字幕一区二区在线观看 | 亚洲高清三级 | 日韩av免费在线观看 | 亚洲综合色视频在线观看 | 中文字幕男人的天堂 | 国产精品一区二区福利视频 | 91麻豆产精品久久久久久 | 日韩一区不卡 | jizz在线看片 | 日韩一区在线播放 | 亚洲精品一区在线 | 日日骚av| 亚洲成人在线免费 | 亚洲国产一区二区三区在线观看 | 亚洲一区二区黄 | 免费看国产精品视频 | 一区二区三区在线播放 |