Visual Studio 11開發指南(16)C++11更新-多線程和非同步作業管理

來源:互聯網
上載者:User

Visual Studio 11增強支援的標準 C + + 11

現在支援此預覽的 Visual Studio 頭的 STL 中的新標頭檔可以進行多線程編程和非同步作業管理。

<thread>,<future>,<atomic>,<time>,<mutex>,<condition_variable>,<ratio>,<filesystem>

標頭檔<thread>作為其名稱來建立和操作線程

 

1.thread t([]() 2.    {     3.     cout <<  "ThreadID : " << std::this_thread::get_id() << endl;         4.    });         5.    t.join();

這是傳遞給線程的類的建構函式的一種方法,而不是在這裡我們使用Lambda 運算式中引入C + + 11Join ()方法,這是一個調用阻塞,使主線程等待,直到線程完成他的工作。如果要解耦變數的類型線程,線程在 Windows 那裡 調用 的detach()方法,這樣做違背計劃的detach()方法,不會影響與線程控制代碼關聯的視窗 (CloseHandle)。因此可能是使用變數的 t 型線,舊 Windows API 通過檢索的本機控制代碼,但代碼將成為攜帶型少得多。

 

1.WaitForSingleObject(t.native_handle()._Hnd ,INFINITE); 2.    t.detach();

 

線上程, join ()方法是實質相同,上述代碼 (在 Windows 平台) 。

很可能也與要檢索的可用使用hardware_concurrency()方法的虛擬處理器數目的線程 ,

unsigned numLogicalProc=t.hardware_concurrency(); 

 

操作的線程,總是會對同步與保護的關鍵地區。頭<mutex>提供這種排斥同步對象相互樣本的效果
注意,使用鎖來總是對效能的影響 !

 std::this_thread::sleep_for (chrono::seconds(1)); 5.    for(int i=0;i<10;i++) 6.    {     7.        m.lock(); 8.            cout <<  "ThreadID : " << std::this_thread::get_id() << ":" << i << endl;         9.        m.unlock (); 10.    } 11.});         12.thread t2([&m]() 13.{          14.    std::this_thread::sleep_for (chrono::seconds(1)); 15.    for(int i=0;i<10;i++) 16.    {         17.        m.lock (); 18.            cout <<  "ThreadID : " << std::this_thread::get_id() << ":" << i << endl;         19.        m.unlock(); 20.    } 21.}); 22.t1.join();     23.t2.join();    

 

 

注意this_thread命名空間以檢索當前線程的標識號或時間類結合建立點的介紹.

它也是執行的可以控制對生產者/消費者下面的樣本使用標頭檔<condition_variable>,作為多個線程流。
注意到我們使消費者和生產者為互斥體,我們轉向方法wait()變數的類型condition_variable_any (它可能還使用condition_variable unique_lock <mutex>型,後者互斥體直接傳遞到類型unique_lock的初始化過程中未報告的狀態。非終止狀態指示可以獲得互斥體。)

 

1.mutex lockBuffer; 2.volatile BOOL ArretDemande=FALSE; 3.queue<long> buffer;         4.condition_variable_any cndNotifierConsommateurs; 5.condition_variable_any cndNotifierProducteur;     6.  7.thread ThreadConsommateur([&]() 8.{ 9.     10.    while(true) 11.        { 12.             13.            lockBuffer.lock (); 14.            while(buffer.empty () && ArretDemande==FALSE) 15.            {                     16.                cndNotifierConsommateurs.wait(lockBuffer); 17.            } 18.            if (ArretDemande==TRUE && buffer.empty ()) 19.            { 20.                lockBuffer.unlock(); 21.                cndNotifierProducteur.notify_one (); 22.                break; 23.            } 24.             25.            long element=buffer.front(); 26.            buffer.pop (); 27.            cout << "Consommation element :" << element << " Taille de la file :" << buffer.size() << endl; 28.             29.            lockBuffer.unlock (); 30.            cndNotifierProducteur.notify_one (); 31.        } 32.         33.}); 34. 35.thread ThreadProducteur([&]() 36.{ 37.    //Operation atomic sur un long 38.    std::atomic<long> interlock; 39.    interlock=1;     40.    while(true) 41.    { 42.            ////Simule une charge 43.            std::this_thread::sleep_for (chrono::milliseconds (15));                 44.            long element=interlock.fetch_add (1); 45.            lockBuffer.lock (); 46.            while(buffer.size()==10 && ArretDemande ==FALSE) 47.            { 48.                 49.                cndNotifierProducteur.wait (lockBuffer); 50.            } 51.            if (ArretDemande==TRUE) 52.            { 53.                 54.                lockBuffer.unlock (); 55.                cndNotifierConsommateurs.notify_one (); 56.                break; 57.            } 58.            buffer.push(element); 59.            cout << "Production unlement :" << element << " Taille de la file :" << buffer.size() << endl; 60.            lockBuffer.unlock (); 61.            cndNotifierConsommateurs.notify_one (); 62.    } 63. 64.}); 65.     66.  67.std::cout << "Pour arreter pressez [ENTREZ]" << std::endl; 68.getchar(); 69.     70.std::cout << "Arret demande" << endl; 71.ArretDemande=TRUE; 72. 73.ThreadProducteur.join(); 74.ThreadConsommateur.join();

 

在樣本中,該互斥體將傳遞給無訊號使用鎖() 方法。不過如果隊列為空白 ,就可以開始在執行序列中執行。

此互斥體用來保護尾 <int> 緩衝區類型。等待() 方法使用另一種機制將這掛起,並將等待喚醒,製造者線程僅當它將調用它的方法notify_one()。

使用這裡的元素類型,遞增 1 在單個原子操作中我們的隊列的元素。在多線程的上下文,另外,例如將總是公平的保證元素操作,而不是搶佔式。

 

標頭檔<future>。未來用於執行非同步作業的返回結果,要檢索後,沒有不同步或線程流量控制機制。樣本中,作為互斥體的多個線程的交會點的方法 join () 和控制流程對象。

事實上,假設您想要簡單的加法的兩個整數 A + B,但是來自兩個不同的線程所返回的結果。

在下面的樣本中,作為不確定何時執行的概念

 

1.std::cout << "Thread Principale : ID : " << std::this_thread::get_id() << endl;         2.    future<int> f1(async([]()->int 3.    { 4.        //Simule une charge 5.        std::this_thread::sleep_for (chrono::milliseconds (2000));                         6.        std::cout << "Future 1  ID : " << std::this_thread::get_id() << endl; 7.         8.        return 42; 9.    })); 10.  11.    future<int> f2(async([]()->int 12.    { 13.         14.        std::cout << "Future 2 ID : " << std::this_thread::get_id() << endl; 15.         16.        return 84; 17.    })); 18.     19.    std::cout << "Resultat : " << f1.get () + f2.get() << endl ; 20.    

在這裡宣布int類型的兩個數值以非同步類型作為參數的建構函式,它作為其名稱在不同的線程中執行非同步作業的指示。

兩個未來將返回的結果,但不知道何時執行Get ()方法,這是一個調用中擔保兩個整數的增加會正確的範例。
在將來的VS11調用中,我們使用文法強烈靠近同步文法的非同步執行。

 

趕緊下載VS11體驗吧

http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.