Visual Studio 11增強支持的標準 C + + 11
現在支持此預覽的 Visual Studio 頭的 STL 中的新頭文件可以進行多線程編程和異步操作管理。
<thread>,<future>,<atomic>,<time>,<mutex>,<condition_variable>,<ratio>,<filesystem>
頭文件<thread>作為其名稱來創建和操作線程
~~~
thread t(
{
cout << "ThreadID : " << std::this_thread::get_id() << endl;
});
t.join();
~~~
這是傳遞給線程的類的構造函數的一種方法,而不是在這里我們使用Lambda 表達式中引入C + + 11Join ()方法,這是一個調用阻塞,使主線程等待,直到線程完成他的工作。如果要解耦變量的類型線程,線程在 Windows 那里?調用 的detach()方法,這樣做違背計劃的detach()方法,不會影響與線程句柄關聯的窗口 (CloseHandle)。因此可能是使用變量的 t 型線,舊 Windows API 通過檢索的本機句柄,但代碼將成為便攜式少得多。
~~~
WaitForSingleObject(t.native_handle()._Hnd ,INFINITE);
t.detach();
~~~
在線程, join ()方法是實質相同,上述代碼 (在 Windows 平臺) 。
很可能也與要檢索的可用使用hardware_concurrency()方法的虛擬處理器數目的線程 ,
~~~
unsigned numLogicalProc=t.hardware_concurrency();?
~~~
操作的線程,總是會對同步與保護的關鍵地區。頭<mutex>提供這種排斥同步對象相互示例的效果
注意,使用鎖來總是對性能的影響 !
~~~
std::this_thread::sleep_for (chrono::seconds(1));
for(int i=0;i<10;i++)
{
m.lock();
cout << "ThreadID : " << std::this_thread::get_id() << ":" << i << endl;
m.unlock ();
}
});
thread t2([&m]()
{
std::this_thread::sleep_for (chrono::seconds(1));
for(int i=0;i<10;i++)
{
m.lock ();
cout << "ThreadID : " << std::this_thread::get_id() << ":" << i << endl;
m.unlock();
}
});
t1.join();
t2.join();
~~~
注意this_thread命名空間以檢索當前線程的標識號或時間類結合創建點的介紹.
它也是執行的可以控制對生產者/消費者下面的示例使用頭文件<condition_variable>,作為多個線程流。
注意到我們使消費者和生產者為互斥體,我們轉向方法wait()變量的類型condition_variable_any (它可能還使用condition_variable unique_lock <mutex>型,后者互斥體直接傳遞到類型unique_lock的初始化過程中未報告的狀態。非終止狀態指示可以獲得互斥體。)
~~~
mutex lockBuffer;
volatile BOOL ArretDemande=FALSE;
queue<long> buffer;
condition_variable_any cndNotifierConsommateurs;
condition_variable_any cndNotifierProducteur;
thread ThreadConsommateur([&]()
{
while(true)
{
lockBuffer.lock ();
while(buffer.empty () && ArretDemande==FALSE)
{
cndNotifierConsommateurs.wait(lockBuffer);
}
if (ArretDemande==TRUE && buffer.empty ())
{
lockBuffer.unlock();
cndNotifierProducteur.notify_one ();
break;
}
long element=buffer.front();
buffer.pop ();
cout << "Consommation element :" << element << " Taille de la file :" << buffer.size() << endl;
lockBuffer.unlock ();
cndNotifierProducteur.notify_one ();
}
});
thread ThreadProducteur([&]()
{
//Operation atomic sur un long
std::atomic<long> interlock;
interlock=1;
while(true)
{
////Simule une charge
std::this_thread::sleep_for (chrono::milliseconds (15));
long element=interlock.fetch_add (1);
lockBuffer.lock ();
while(buffer.size()==10 && ArretDemande ==FALSE)
{
cndNotifierProducteur.wait (lockBuffer);
}
if (ArretDemande==TRUE)
{
lockBuffer.unlock ();
cndNotifierConsommateurs.notify_one ();
break;
}
buffer.push(element);
cout << "Production unlement :" << element << " Taille de la file :" << buffer.size() << endl;
lockBuffer.unlock ();
cndNotifierConsommateurs.notify_one ();
}
});
std::cout << "Pour arreter pressez [ENTREZ]" << std::endl;
68.getchar();
std::cout << "Arret demande" << endl;
ArretDemande=TRUE;
ThreadProducteur.join();
ThreadConsommateur.join();
~~~
在示例中,該互斥體將傳遞給無信號使用鎖() 方法。不過如果隊列為空 ,就可以開始在執行序列中執行。
此互斥體用來保護尾 <int> 緩沖區類型。等待() 方法使用另一種機制將這掛起,并將等待喚醒,制造者線程僅當它將調用它的方法notify_one()。
使用這里的元素類型,遞增 1 在單個原子操作中我們的隊列的元素。在多線程的上下文,另外,例如將總是公平的保證元素操作,而不是搶占式。
?
頭文件<future>。未來用于執行異步操作的返回結果,要檢索后,沒有不同步或線程流量控制機制。示例中,作為互斥體的多個線程的交會點的方法 join () 和控制流對象。
事實上,假設您想要簡單的加法的兩個整數 A + B,但是來自兩個不同的線程所返回的結果。
在下面的示例中,作為不確定何時執行的概念
?
~~~
std::cout << "Thread Principale : ID : " << std::this_thread::get_id() << endl;
future<int> f1(async(->int
{
//Simule une charge
std::this_thread::sleep_for (chrono::milliseconds (2000));
std::cout << "Future 1 ID : " << std::this_thread::get_id() << endl;
return 42;
}));
future<int> f2(async(->int
{
std::cout << "Future 2 ID : " << std::this_thread::get_id() << endl;
return 84;
}));
std::cout << "Resultat : " << f1.get () + f2.get() << endl ;
~~~
在這里宣布int類型的兩個數值以異步類型作為參數的構造函數,它作為其名稱在不同的線程中執行異步操作的指示。
兩個未來將返回的結果,但不知道何時執行Get ()方法,這是一個調用中擔保兩個整數的增加會正確的范例。
在將來的VS11調用中,我們使用語法強烈靠近同步語法的異步執行。
?
趕緊下載VS11體驗吧
[http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)
?
- 前言
- Visual Studio 11開發指南(1) Visual Studio 11簡介與新特性
- Visual Studio 11開發指南(2) Visual Studio 11放棄宏處理
- Visual Studio 11開發指南(3)Visual Studio 11開發SharePoint 2011程序
- Visual Studio 11開發指南(4)Visual Studio 11編程語言發展
- Visual Studio 11開發指南(5)Visual Studio 11 IDE增強
- Visual Studio 11開發指南(6)Visual Studio 11平臺改進
- Visual Studio 11開發指南(7)NET 4.5的改善
- Visual Studio 11開發指南(8)Visual C++ 11新特色
- Visual Studio 11開發指南(9)Visual C++ 新功能體驗
- Visual Studio 11開發指南(10)Visual C++11 IDE 新功能體驗
- Visual Studio 11開發指南(11)Visual Studio 11調試游戲
- Visual Studio 11開發指南(12)Visual Studio 11可視化多核多線程編程的行為
- Visual Studio 11開發指南(13)C++11語言新特性
- Visual Studio 11開發指南(14)C++11---C++/ CX設計
- Visual Studio 11開發指南(15)C++11單元測試
- Visual Studio 11開發指南(16)C++11更新-多線程和異步操作管理
- Visual Studio 11開發指南(17)C++11更新- Lambda表達式
- Visual Studio 11開發指南(18)C++11更新-自動矢量器使用
- Visual Studio 11開發指南(19)C++11更新-并行模式庫和代理庫
- 在 C++ 中使用 PPL 進行異步編程
- 基于VisualStudio11開發Windows8的Metro sample講解(1)MessageBox
- Visual C++ 11 中新的并發功能
- 基于Windows8與Visual Studio2012開發內核隱藏注冊表
- 基于VC++2012在Windows8上實現文件隱藏
- 實現諾基亞 lumia Windows phone 的手機通話記錄截取
- 最短代碼實現windows8下的下載器-下載安裝執行一體化
- 用Visual studio2012在Windows8上開發內核驅動監視線程創建
- 用Visual studio2012在Windows8上開發內核驅動監視進程創建
- 基于Windows8與Visual Studio2012實現殺毒通用模塊
- 用Visual studio2012在Windows8上開發內核中隱藏進程
- 用Visual studio11在Windows8上開發內核枚舉注冊表
- 用Visual studio11在Windows8上開發內核驅動隱藏注冊表
- 用Visual studio11在Windows8上開發驅動實現注冊表監控和過濾
- 用Visual studio11在Windows8上開發驅動實現內存填0殺進程
- 【CSDN2012年度博客之星】喜歡本博客的讀者,投票贈送《visual C++2010開發權威指南》電子稿--感謝支持 ~(截至到2012年12月30日)
- 今天在清華圖書館看到我的杰作,感慨萬千,而我要歸零一切 !
- use Visual studio2012 developing kernel driver monitor thread creation on Windows8
- To kernel driver monitoring process developed in Windows8 create using Visual studio2012
- Under Windows8 kernel mode development NDIS application-NDIS Filter explain
- use Visual studio2012 development kernel to hidden process on Windows8