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

鍍金池/ 教程/ C/ 6.1 為并發(fā)設(shè)計(jì)的意義何在?
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ì)無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的指導(dǎo)建議
關(guān)于這本書(shū)
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章 多線程程序的測(cè)試和調(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ā)庫(kù)的簡(jiǎn)單比較
5.3 同步操作和強(qiáng)制排序
A.8 線程本地變量
第8章 并發(fā)代碼設(shè)計(jì)
3.3 保護(hù)共享數(shù)據(jù)的替代設(shè)施
附錄D C++線程庫(kù)參考
第7章 無(wú)鎖并發(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語(yǔ)言特性的簡(jiǎn)要介紹
第6章 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
封面圖片介紹
7.2 無(wú)鎖數(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ù)帶來(lái)的問(wèn)題
資源
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 使用同步操作簡(jiǎn)化代碼
A.2 刪除函數(shù)
1.3 C++中的并發(fā)和多線程
1.4 開(kāi)始入門
第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ù)

6.1 為并發(fā)設(shè)計(jì)的意義何在?

設(shè)計(jì)并發(fā)數(shù)據(jù)結(jié)構(gòu),意味著多個(gè)線程可以并發(fā)的訪問(wèn)這個(gè)數(shù)據(jù)結(jié)構(gòu),線程可對(duì)這個(gè)數(shù)據(jù)結(jié)構(gòu)做相同或不同的操作,并且每一個(gè)線程都能在自己的自治域中看到該數(shù)據(jù)結(jié)構(gòu)。且在多線程環(huán)境下,無(wú)數(shù)據(jù)丟失和損毀,所有的數(shù)據(jù)需要維持原樣,且無(wú)條件競(jìng)爭(zhēng)。這樣的數(shù)據(jù)結(jié)構(gòu),稱之為“線程安全”的數(shù)據(jù)結(jié)構(gòu)。通常情況下,當(dāng)多個(gè)線程對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行同一并發(fā)操作是安全的,但不同操作則需要單線程獨(dú)立訪問(wèn)數(shù)據(jù)結(jié)構(gòu)?;蛳喾?,當(dāng)線程執(zhí)行不同的操作時(shí),對(duì)同一數(shù)據(jù)結(jié)構(gòu)的并發(fā)操作是安全的,而多線程執(zhí)行同樣的操作,則會(huì)出現(xiàn)問(wèn)題。

實(shí)際的設(shè)計(jì)意義并不止上面提到的那樣:這就意味著,要為線程提供并發(fā)訪問(wèn)數(shù)據(jù)結(jié)構(gòu)的機(jī)會(huì)。本質(zhì)上,是使用互斥量提供互斥特性:在互斥量的保護(hù)下,同一時(shí)間內(nèi)只有一個(gè)線程可以獲取互斥鎖。互斥量為了保護(hù)數(shù)據(jù),顯式的阻止了線程對(duì)數(shù)據(jù)結(jié)構(gòu)的并發(fā)訪問(wèn)。

這被稱為序列化(serialzation):線程輪流訪問(wèn)被保護(hù)的數(shù)據(jù)。這其實(shí)是對(duì)數(shù)據(jù)進(jìn)行串行的訪問(wèn),而非并發(fā)。因此,你需要對(duì)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)進(jìn)行仔細(xì)斟酌,確保其能真正并發(fā)訪問(wèn)。雖然,一些數(shù)據(jù)結(jié)構(gòu)有著比其他數(shù)據(jù)結(jié)構(gòu)多的并發(fā)訪問(wèn)范圍,但是在所有情況下的思路都是一樣的:減少保護(hù)區(qū)域,減少序列化操作,就能提升并發(fā)訪問(wèn)的潛力。

在我們進(jìn)行數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)之前,讓我們快速的瀏覽一下,在并發(fā)設(shè)計(jì)中的指導(dǎo)建議。

6.1.1 數(shù)據(jù)結(jié)構(gòu)并發(fā)設(shè)計(jì)的指導(dǎo)與建議(指南)

如之前提到的,當(dāng)設(shè)計(jì)并發(fā)數(shù)據(jù)結(jié)構(gòu)時(shí),有兩方面需要考量:一是確保訪問(wèn)是安全的,二是能真正的并發(fā)訪問(wèn)。在第3章的時(shí)候,已經(jīng)對(duì)如何保證數(shù)據(jù)結(jié)構(gòu)是線程安全的做過(guò)簡(jiǎn)單的描述:

  • 確保無(wú)線程能夠看到,數(shù)據(jù)結(jié)構(gòu)的“不變量”破壞時(shí)的狀態(tài)。

  • 小心那些會(huì)引起條件競(jìng)爭(zhēng)的接口,提供完整操作的函數(shù),而非操作步驟。

  • 注意數(shù)據(jù)結(jié)構(gòu)的行為是否會(huì)產(chǎn)生異常,從而確?!安蛔兞俊钡臓顟B(tài)穩(wěn)定。

  • 將死鎖的概率降到最低。使用數(shù)據(jù)結(jié)構(gòu)時(shí),需要限制鎖的范圍,且避免嵌套鎖的存在。

在你思考設(shè)計(jì)細(xì)節(jié)前,你還需要考慮這個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)于使用者來(lái)說(shuō)有什么限制;當(dāng)一個(gè)線程通過(guò)一個(gè)特殊的函數(shù)對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行訪問(wèn)時(shí),那么還有哪些函數(shù)能被其他的線程安全調(diào)用呢?

這是一個(gè)很重要的問(wèn)題,普通的構(gòu)造函數(shù)和析構(gòu)函數(shù)需要獨(dú)立訪問(wèn)數(shù)據(jù)結(jié)構(gòu),所以用戶在使用的時(shí)候,就不能在構(gòu)造函數(shù)完成前,或析構(gòu)函數(shù)完成后對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行訪問(wèn)。當(dāng)數(shù)據(jù)結(jié)構(gòu)支持賦值操作,swap(),或拷貝構(gòu)造時(shí),作為數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)者,即使數(shù)據(jù)結(jié)構(gòu)中有大量的函數(shù)被線程所操縱時(shí),你也需要保證這些操作在并發(fā)環(huán)境下是安全的(或確保這些操作能夠獨(dú)立訪問(wèn)),以保證并發(fā)訪問(wèn)時(shí)不會(huì)出現(xiàn)錯(cuò)誤。

第二個(gè)方面是,確保真正的并發(fā)訪問(wèn)。這里沒(méi)法提供更多的指導(dǎo)意見(jiàn);不過(guò),作為一個(gè)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)者,在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí),自行考慮以下問(wèn)題:

  • 鎖的范圍中的操作,是否允許在鎖外執(zhí)行?

  • 數(shù)據(jù)結(jié)構(gòu)中不同的區(qū)域是否能被不同的互斥量所保護(hù)?

  • 所有操作都需要同級(jí)互斥量保護(hù)嗎?

  • 能否對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行簡(jiǎn)單的修改,以增加并發(fā)訪問(wèn)的概率,且不影響操作語(yǔ)義?

這些問(wèn)題都源于一個(gè)指導(dǎo)思想:如何讓序列化訪問(wèn)最小化,讓真實(shí)并發(fā)最大化?允許線程并發(fā)讀取的數(shù)據(jù)結(jié)構(gòu)并不少見(jiàn),而對(duì)數(shù)據(jù)結(jié)構(gòu)的修改,必須是單線程獨(dú)立訪問(wèn)。這種結(jié)構(gòu),類似于boost::shared_mutex。同樣的,這種數(shù)據(jù)結(jié)構(gòu)也很常見(jiàn)——支持在多線程執(zhí)行不同的操作時(shí),并序列化執(zhí)行相同的操作的線程(你很快就能看到)。

最簡(jiǎn)單的線程安全結(jié)構(gòu),通常使用的是互斥量和鎖,對(duì)數(shù)據(jù)進(jìn)行保護(hù)。雖然,這么做還是有問(wèn)題(如同在第3中提到的那樣),不過(guò)這樣相對(duì)簡(jiǎn)單,且保證只有一個(gè)線程在同一時(shí)間對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行一次訪問(wèn)。為了讓你輕松的設(shè)計(jì)線程安全的數(shù)據(jù)結(jié)構(gòu),接下來(lái)了解一下基于鎖的數(shù)據(jù)結(jié)構(gòu),以及第7章將提到的無(wú)鎖并發(fā)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。