在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 1.4 開始入門
3.4 本章總結(jié)
6.3 基于鎖設(shè)計(jì)更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
6.1 為并發(fā)設(shè)計(jì)的意義何在?
5.2 <code>C++</code>中的原子操作和原子類型
A.7 自動(dòng)推導(dǎo)變量類型
2.1 線程管理的基礎(chǔ)
8.5 在實(shí)踐中設(shè)計(jì)并發(fā)代碼
2.4 運(yùn)行時(shí)決定線程數(shù)量
2.2 向線程函數(shù)傳遞參數(shù)
第4章 同步并發(fā)操作
2.3 轉(zhuǎn)移線程所有權(quán)
8.3 為多線程性能設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)
6.4 本章總結(jié)
7.3 對(duì)于設(shè)計(jì)無鎖數(shù)據(jù)結(jié)構(gòu)的指導(dǎo)建議
關(guān)于這本書
A.1 右值引用
2.6 本章總結(jié)
D.2 &lt;condition_variable&gt;頭文件
A.6 變參模板
6.2 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)
4.5 本章總結(jié)
A.9 本章總結(jié)
前言
第10章 多線程程序的測試和調(diào)試
5.4 本章總結(jié)
第9章 高級(jí)線程管理
5.1 內(nèi)存模型基礎(chǔ)
2.5 識(shí)別線程
第1章 你好,C++的并發(fā)世界!
1.2 為什么使用并發(fā)?
A.5 Lambda函數(shù)
第2章 線程管理
4.3 限定等待時(shí)間
D.3 &lt;atomic&gt;頭文件
10.2 定位并發(fā)錯(cuò)誤的技術(shù)
附錄B 并發(fā)庫的簡單比較
5.3 同步操作和強(qiáng)制排序
A.8 線程本地變量
第8章 并發(fā)代碼設(shè)計(jì)
3.3 保護(hù)共享數(shù)據(jù)的替代設(shè)施
附錄D C++線程庫參考
第7章 無鎖并發(fā)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
D.7 &lt;thread&gt;頭文件
D.1 &lt;chrono&gt;頭文件
4.1 等待一個(gè)事件或其他條件
A.3 默認(rèn)函數(shù)
附錄A 對(duì)<code>C++</code>11語言特性的簡要介紹
第6章 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
封面圖片介紹
7.2 無鎖數(shù)據(jù)結(jié)構(gòu)的例子
8.6 本章總結(jié)
8.1 線程間劃分工作的技術(shù)
4.2 使用期望等待一次性事件
8.4 設(shè)計(jì)并發(fā)代碼的注意事項(xiàng)
D.5 &lt;mutex&gt;頭文件
3.1 共享數(shù)據(jù)帶來的問題
資源
9.3 本章總結(jié)
10.3 本章總結(jié)
10.1 與并發(fā)相關(guān)的錯(cuò)誤類型
D.4 &lt;future&gt;頭文件
3.2 使用互斥量保護(hù)共享數(shù)據(jù)
9.1 線程池
1.1 何謂并發(fā)
9.2 中斷線程
4.4 使用同步操作簡化代碼
A.2 刪除函數(shù)
1.3 C++中的并發(fā)和多線程
1.4 開始入門
第5章 C++內(nèi)存模型和原子類型操作
消息傳遞框架與完整的ATM示例
8.2 影響并發(fā)代碼性能的因素
7.1 定義和意義
D.6 &lt;ratio&gt;頭文件
A.4 常量表達(dá)式函數(shù)
7.4 本章總結(jié)
1.5 本章總結(jié)
第3章 線程間共享數(shù)據(jù)

1.4 開始入門

ok!現(xiàn)在你有一個(gè)能與C++11標(biāo)準(zhǔn)兼容的編譯器。接下來呢?一個(gè)C++多線程程序是什么樣子呢?其實(shí),它看上去和其他C++程序差不多,通常是變量、類以及函數(shù)的組合。唯一的區(qū)別在于某些函數(shù)可以并發(fā)運(yùn)行,所以需要確保共享數(shù)據(jù)在并發(fā)訪問時(shí)是安全的,詳見第3章。當(dāng)然,為了并發(fā)地運(yùn)行函數(shù),必須使用特定的函數(shù)以及對(duì)象來管理各個(gè)線程。

1.4.1 你好,并發(fā)世界

從一個(gè)經(jīng)典的例子開始:一個(gè)打印“Hello World.”的程序。一個(gè)非常簡單的在單線程中運(yùn)行的Hello World程序如下所示,當(dāng)我們談到多線程時(shí),它可以作為一個(gè)基準(zhǔn)。

```c++

include

int main() { std::cout << "Hello World\n"; }


這個(gè)程序所做的就是將“Hello World”寫進(jìn)標(biāo)準(zhǔn)輸出流。讓我們將它與下面清單所示的簡單的“Hello, Concurrent World”程序做個(gè)比較,它啟動(dòng)了一個(gè)獨(dú)立的線程來顯示這個(gè)信息。

清單 1.1  一個(gè)簡單的Hello, Concurrent World程序:

include

include //①

void hello() //② { std::cout << "Hello Concurrent World\n"; } int main() { std::thread t(hello); //③ t.join(); //④ }



第一個(gè)區(qū)別是增加了`#include <thread>`①,標(biāo)準(zhǔn)C++庫中對(duì)多線程支持的聲明在新的頭文件中:管理線程的函數(shù)和類在`<thread>`中聲明,而保護(hù)共享數(shù)據(jù)的函數(shù)和類在其他頭文件中聲明。

其次,打印信息的代碼被移動(dòng)到了一個(gè)獨(dú)立的函數(shù)中②。因?yàn)槊總€(gè)線程都必須具有一個(gè)*初始函數(shù)*(initial function),新線程的執(zhí)行從這里開始。對(duì)于應(yīng)用程序來說,初始線程是main(),但是對(duì)于其他線程,可以在`std::thread`對(duì)象的構(gòu)造函數(shù)中指定——本例中,被命名為t③的`std::thread`對(duì)象擁有新函數(shù)hello()作為其初始函數(shù)。

下一個(gè)區(qū)別:與直接寫入標(biāo)準(zhǔn)輸出或是從main()調(diào)用hello()不同,該程序啟動(dòng)了一個(gè)全新的線程來實(shí)現(xiàn),將線程數(shù)量一分為二——初始線程始于main(),而新線程始于hello()。

新的線程啟動(dòng)之后③,初始線程繼續(xù)執(zhí)行。如果它不等待新線程結(jié)束,它就將自顧自地繼續(xù)運(yùn)行到main()的結(jié)束,從而結(jié)束程序——有可能發(fā)生在新線程運(yùn)行之前。這就是為什么在④這里調(diào)用`join()`的原因——詳見第2章,這會(huì)導(dǎo)致調(diào)用線程(在main()中)等待與`std::thread`對(duì)象相關(guān)聯(lián)的線程,即這個(gè)例子中的t。

這看起來僅僅為了將一條信息寫入標(biāo)準(zhǔn)輸出而做了大量的工作,確實(shí)如此——正如上文1.2.3節(jié)所描述的,一般來說并不值得為了如此簡單的任務(wù)而使用多線程,尤其是在這期間初始線程并沒做什么。本書后面的內(nèi)容中,將通過實(shí)例來展示在哪些情景下使用多線程可以獲得收益。