編程指南》全覽:一條從 std::thread 到內(nèi)存模型的 C++11 并發(fā)學(xué)習(xí)路線)
教程并發(fā)編程【免費(fèi)下載鏈接】Cplusplus-Concurrency-In-PracticeA Detailed Cplusplus Concurrency Tutorial 《C 并發(fā)編程指南》項(xiàng)目地址https://gitcode.com/gh_mirrors/cp/Cplusplus-Concurrency-In-Practice點(diǎn)擊查看免費(fèi)下載本指南對(duì)開(kāi)源倉(cāng)庫(kù) README.md 進(jìn)行全面解讀它是一本面向中文 C 開(kāi)發(fā)者的 C11 并發(fā)編程教程圍繞atomic、thread、mutex、condition_variable、future五大頭文件規(guī)劃了從并發(fā)基礎(chǔ)、線程與互斥量到內(nèi)存模型與并發(fā)數(shù)據(jù)結(jié)構(gòu)的 11 章學(xué)習(xí)路線。讀完本文你將掌握這本書的整體知識(shí)框架、各章節(jié)的核心知識(shí)點(diǎn)、倉(cāng)庫(kù)內(nèi)唯一的可運(yùn)行示例std::threadHello World 的編譯運(yùn)行方式以及如何按圖索驥深入研讀每一章。寫作動(dòng)機(jī)為什么需要這樣一本書《C 并發(fā)編程指南》英文名A Detailed Cplusplus Concurrency Tutorial是作者 forhappy傅海平在空余時(shí)間撰寫的個(gè)人項(xiàng)目2013 年 8 月 31 日提交了第一行內(nèi)容。書中坦誠(chéng)說(shuō)明由于時(shí)間倉(cāng)促、水平有限內(nèi)容不可能盡善盡美歡迎讀者反饋錯(cuò)誤與改進(jìn)建議也歡迎感興趣的同學(xué)共同參與完善。書的創(chuàng)作出于兩個(gè)目的傳播知識(shí)介紹 C 并發(fā)編程。作者指出當(dāng)時(shí)國(guó)內(nèi)還沒(méi)有一本完整介紹 C11 并發(fā)編程的中文書籍希望本書能幫助廣大 C 開(kāi)發(fā)者學(xué)習(xí)并發(fā)編程降低學(xué)習(xí)難度減少初學(xué)者對(duì)并發(fā)編程的恐懼感。自我激勵(lì)和提高。作者自謙為C 菜鳥(niǎo)通過(guò)查閱資料、推敲表述的過(guò)程積累知識(shí)提升思維與語(yǔ)言表達(dá)能力。這一動(dòng)機(jī)直接決定了本書的定位面向初學(xué)者的、體系化的 C11 并發(fā)編程入門教程而非某一特定框架的 API 手冊(cè)。全書結(jié)構(gòu)11 章 附錄的完整學(xué)習(xí)路線倉(cāng)庫(kù)的 Table-of-contents.md 給出了詳細(xì)的章節(jié)安排。全書共 11 章加一個(gè)附錄從最基礎(chǔ)的并發(fā)概念開(kāi)始層層遞進(jìn)到高級(jí)的線程管理與并發(fā)數(shù)據(jù)結(jié)構(gòu)章節(jié)主題倉(cāng)庫(kù)內(nèi)對(duì)應(yīng)目錄第一章并發(fā)編程基礎(chǔ)zh/chapter1-Introduction第二章幾種常見(jiàn)的多線程庫(kù)介紹zh/chapter2-Thread-Libraries第三章線程詳解zh/chapter3-Thread第四章互斥量與鎖zh/chapter4-Mutex第五章條件變量與線程同步zh/chapter5-Condition-Variable第六章異步任務(wù)詳解zh/chapter6-Future第七章原子類型詳解zh/chapter7-Atomic第八章C11 內(nèi)存模型zh/chapter8-Memory-Model第九章高級(jí)線程管理zh/chapter9-Advanced-Thread-Management第十章如何編寫正確的并發(fā)數(shù)據(jù)結(jié)構(gòu)zh/chapter10-Concurrent-Data-Structure第十一章并發(fā)編程應(yīng)用實(shí)例zh/chapter11-Application附錄C11 新標(biāo)準(zhǔn)概覽zh/appendix C11 standards第一章并發(fā)編程基礎(chǔ)——先弄清并發(fā)到底是什么第一章是全書的起點(diǎn)回答三個(gè)基本問(wèn)題什么是并發(fā)編程、并發(fā)與并行的聯(lián)系和區(qū)別、為什么需要并發(fā)編程。在 1.1 什么是并發(fā) 中作者用大腦同時(shí)控制雙手敲鍵盤和耳朵聽(tīng)音樂(lè)的生活類比引入并發(fā)概念并系統(tǒng)對(duì)比了多種業(yè)界觀點(diǎn)Erlang 之父 Joe Armstrong 的觀點(diǎn)并發(fā)是兩個(gè)等待隊(duì)列競(jìng)爭(zhēng)一臺(tái)咖啡機(jī)存在競(jìng)爭(zhēng)與同步問(wèn)題并行是每個(gè)隊(duì)列擁有自己的咖啡機(jī)互不干擾。Go 發(fā)明者之一 Rob Pike 的觀點(diǎn)Concurrency is about dealing with lots of things at once一次處理很多事情關(guān)乎程序結(jié)構(gòu)Parallelism is about doing lots of things at once一次做很多事情關(guān)乎程序執(zhí)行。Intel 中文網(wǎng)站的觀點(diǎn)并發(fā)是一個(gè)處理器同時(shí)處理多個(gè)任務(wù)邏輯上的同時(shí)發(fā)生并行是多個(gè)處理器或多核同時(shí)處理不同任務(wù)物理上的同時(shí)發(fā)生。第一章還給出了 C 并發(fā)編程初探介紹 C11 引入的五個(gè)多線程頭文件并給出了全書第一個(gè)可運(yùn)行示例std::threadHello world。第二章多線程庫(kù)對(duì)比——從 Pthread 到 C11第二章介紹幾種常見(jiàn)的多線程庫(kù)包括 Pthread 多線程編程指南、Windows 多線程編程以及幾種多線程庫(kù)的接口對(duì)比幫助讀者理解 C11 標(biāo)準(zhǔn)線程庫(kù)相比傳統(tǒng)平臺(tái)線程庫(kù)的差異與優(yōu)勢(shì)。第三章線程詳解——std::thread全剖析第三章的核心文檔是 Introduction-to-Thread.md完整呈現(xiàn)了thread頭文件摘要與std::thread類摘要覆蓋構(gòu)造與賦值默認(rèn)構(gòu)造函數(shù)、初始化構(gòu)造函數(shù)template class F, class... Args explicit thread(F f, Args... args)、被禁用的拷貝構(gòu)造、move 構(gòu)造move 賦值與被禁用的拷貝賦值???join 的線程對(duì)象必須在其銷毀前被join或detach。成員函數(shù)get_id、joinable、join、detach、swap、native_handle以及靜態(tài)成員函數(shù)hardware_concurrency。std::this_thread命名空間get_id、yield、sleep_until、sleep_for四個(gè)輔助函數(shù)。每個(gè)函數(shù)都配有可直接編譯運(yùn)行的示例代碼例如通過(guò)native_handle結(jié)合 Pthread 的pthread_getschedparam/pthread_setschedparam調(diào)整線程調(diào)度優(yōu)先級(jí)。第四章互斥量與鎖——保護(hù)共享數(shù)據(jù)的四類 Mutex 與兩類鎖第四章圍繞mutex頭文件展開(kāi)見(jiàn) 4.1 Mutex-header-synopsis.md核心內(nèi)容如下四類互斥量std::mutex最基本不允許重復(fù)上鎖重復(fù)上鎖會(huì)死鎖、std::recursive_mutex允許遞歸上鎖lock/unlock 次數(shù)需相同、std::timed_mutex額外提供try_lock_for/try_lock_until定時(shí)上鎖、std::recursive_timed_mutex遞歸 定時(shí)特性的組合。兩類 RAII 鎖std::lock_guard構(gòu)造時(shí)上鎖、析構(gòu)時(shí)自動(dòng)解鎖最安全簡(jiǎn)單與std::unique_lock提供lock、try_lock、try_lock_for、try_lock_until、unlock、release、owns_lock、operator bool、mutex等更靈活的控制詳見(jiàn) 4.3 Lock-tutorial.md。三個(gè) Tag 標(biāo)記類std::adopt_lock_t、std::defer_lock_t、std::try_to_lock_t及其常量對(duì)象用于控制lock_guard/unique_lock的構(gòu)造行為。輔助函數(shù)std::try_lock、std::lock同時(shí)對(duì)多個(gè)互斥量上鎖以避免死鎖、std::call_once保證函數(shù)只被調(diào)用一次。第四章還包含std::mutex與 Pthread 互斥量的對(duì)比小節(jié)并給出try_lock計(jì)數(shù)器、timed_mutex煙花示例等實(shí)戰(zhàn)代碼。第五章條件變量與線程同步第五章的核心是 5.2 Condition-variable-tutorial.md講解std::condition_variable的完整用法wait/wait_for/wait_until阻塞當(dāng)前線程直到收到通知或超時(shí)帶謂詞的重載等價(jià)于while (!pred()) wait(lck)能有效避免虛假喚醒。等待期間自動(dòng)unlock被喚醒后自動(dòng)lock。notify_one/notify_all喚醒單個(gè)或多個(gè)等待線程。std::condition_variable_any可接受任意 Lockable 類型不限于unique_lockmutex。std::cv_status枚舉no_timeout與timeout用于判斷wait_for/wait_until是否超時(shí)。章內(nèi)10 threads ready to race、生產(chǎn)-消費(fèi)等待等示例的運(yùn)行輸出也一并給出可直接對(duì)照驗(yàn)證。第六章異步任務(wù)詳解——promise / future / packaged_task / async第六章介紹future頭文件見(jiàn) 6.1 Future-header-synopsis.md包括Provider 類std::promise通過(guò)set_value/set_exception設(shè)置共享狀態(tài)的值std::packaged_task包裝可調(diào)用對(duì)象并異步返回結(jié)果詳見(jiàn) 6.2 Providers-tutorial.md。Future 類std::future獨(dú)占、不可拷貝、只能 move與std::shared_future可拷貝、可被多個(gè)線程共享讀取提供get、valid、wait、wait_for、wait_until等成員詳見(jiàn) 6.4 Future-tutorial.md。輔助函數(shù)與類型std::async支持launch::async/launch::deferred策略、std::future_error、std::future_errc、std::future_status枚舉。章內(nèi)的素?cái)?shù)檢測(cè)示例展示了std::asyncwait_for輪詢的超時(shí)等待模式是理解異步任務(wù)價(jià)值的關(guān)鍵案例。第七章原子類型詳解第七章介紹atomic頭文件涵蓋std::atomic_flag無(wú)鎖布爾原子類型、基本std::atomic類型、特化的std::atomic類型以及 C 風(fēng)格的原子操作為后續(xù)內(nèi)存模型章節(jié)打下基礎(chǔ)。第八章C11 內(nèi)存模型第八章深入底層內(nèi)容包括 C 內(nèi)存模型概述、X86 CPU 處理器架構(gòu)與存儲(chǔ)一致性模型簡(jiǎn)介、內(nèi)存序Memory Order與同步操作、原子類型編程實(shí)例、Lock-free 編程初探。核心文檔包括 8.2 C11 memory-model-explained.md 與 8.3 Synchronization-and-ordering.md。第九章至第十一章進(jìn)階主題第九章 高級(jí)線程管理探討線程管理的高級(jí)話題。第十章 如何編寫正確的并發(fā)數(shù)據(jù)結(jié)構(gòu)關(guān)注并發(fā)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)正確性。第十一章 并發(fā)編程應(yīng)用實(shí)例給出完整的實(shí)戰(zhàn)方案其中最經(jīng)典的是 11.1 Producer-Consumer-solution.md綜合運(yùn)用std::thread、std::mutex、std::condition_variable、std::unique_lock解決生產(chǎn)者消費(fèi)者問(wèn)題并覆蓋單生產(chǎn)者-單消費(fèi)者、單生產(chǎn)者-多消費(fèi)者、多生產(chǎn)者-單消費(fèi)者、多生產(chǎn)者-多消費(fèi)者四種模型是檢驗(yàn)前幾章學(xué)習(xí)成果的最佳綜合練習(xí)。附錄C11 新標(biāo)準(zhǔn)概覽附錄系統(tǒng)梳理 C11 語(yǔ)言與標(biāo)準(zhǔn)庫(kù)的新特性包括核心語(yǔ)言的運(yùn)行時(shí)性能強(qiáng)化右值引用和 move 語(yǔ)義、泛化的constexpr、POD 類型修正、可用性強(qiáng)化初始化列表、auto/decltype類型推導(dǎo)、lambda 表達(dá)式、nullptr、強(qiáng)類型枚舉等以及 C 標(biāo)準(zhǔn)庫(kù)的變更多線程支持、tuple、散列表、正則表達(dá)式、智能指針、隨機(jī)數(shù)等。想系統(tǒng)了解 C11 新特性的讀者可以從 附錄目錄 開(kāi)始。倉(cāng)庫(kù)里的第一個(gè)可運(yùn)行示例std::threadHello World倉(cāng)庫(kù)的code/目錄下目前包含第一章的示例工程 hello-world.cc這是全書最簡(jiǎn)單、也最能說(shuō)明從語(yǔ)言層面創(chuàng)建線程的示例#include cstdio #include cstdlib #include iostream // std::cout #include thread // std::thread void thread_task() { std::cout hello thread std::endl; } int main(int argc, const char *argv[]) { std::thread t(thread_task); t.join(); return EXIT_SUCCESS; }配套的 Makefile 展示了 C11 線程程序在 Linux/GCC 環(huán)境下的關(guān)鍵編譯參數(shù)all:hello-world CCg CPPFLAGS-Wall -stdc11 -ggdb LDFLAGS-pthread hello-world:hello-world.o $(CC) $(LDFLAGS) -o $ $^ hello-world.o:hello-world.cc $(CC) $(CPPFLAGS) -o $ -c $^ .PHONY: clean clean: rm hello-world.o hello-world這里有兩點(diǎn)需要特別留意這也是第一章文檔中反復(fù)強(qiáng)調(diào)的實(shí)戰(zhàn)要點(diǎn)編譯時(shí)必須加-pthread鏈接選項(xiàng)。在 Linux GCC 4.6 環(huán)境下如果編譯時(shí)不加-pthread運(yùn)行時(shí)會(huì)出現(xiàn)$ ./Thread terminate called after throwing an instance of std::system_error what(): Operation not permitted Aborted (core dumped)原因是 GCC 默認(rèn)沒(méi)有加載 pthread 庫(kù)。CPPFLAGS-stdc11用于開(kāi)啟 C11 標(biāo)準(zhǔn)如果你的編譯器不支持-stdc11可嘗試用-stdc0x替代并確保 GCC 已經(jīng)升級(jí)。join()保證主線程等待子線程結(jié)束。示例中std::thread t(thread_task); t.join();展示了線程對(duì)象的基本生命周期管理——一個(gè)可 join 的std::thread必須在銷毀前被join或detach。如何按圖索驥閱讀本倉(cāng)庫(kù)本倉(cāng)庫(kù)的組織方式非常適合自學(xué)先讀目錄Table-of-contents.md 是全書地圖標(biāo)明了每一章、每一小節(jié)的文檔位置部分小節(jié)附有指向具體文檔的鏈接建議先通讀一遍建立整體認(rèn)知。按章推進(jìn)每章目錄下都有README.md作為本章導(dǎo)讀如 第四章導(dǎo)讀、第六章導(dǎo)讀概括本章要點(diǎn)正文文檔按x.y 小節(jié)標(biāo)題.md的命名規(guī)則排列順序閱讀即可。用web-resources.md擴(kuò)展視野每章末尾的web-resources.md匯總了該主題的參考資料例如 第一章資料匯。動(dòng)手編譯驗(yàn)證code/目錄下的示例如 hello-world.cc可以直接用配套 Makefile 編譯運(yùn)行建議邊讀邊跑把文檔中的運(yùn)行輸出如第五章的 10 threads ready to race...、第六章的素?cái)?shù)檢測(cè)結(jié)果親自復(fù)現(xiàn)一遍。參與方式與 License項(xiàng)目處于創(chuàng)作早期作者歡迎讀者反饋錯(cuò)誤、提出改進(jìn)建議也歡迎感興趣的同學(xué)加入貢獻(xiàn)者名單貢獻(xiàn)者名單目前虛位以待。全書采用MIT License開(kāi)源版權(quán)歸原作者傅海平所有完整的許可文本見(jiàn)倉(cāng)庫(kù)根目錄的 LICENSE 文件任何人可以自由使用、復(fù)制、修改、合并、出版、分發(fā)、再許可和/或銷售該軟件的副本同時(shí)需在軟件的所有副本或?qū)嵸|(zhì)部分中包含上述版權(quán)聲明和許可聲明軟件按原樣提供不附帶任何明示或暗示的擔(dān)保。結(jié)語(yǔ)一條可復(fù)現(xiàn)的 C11 并發(fā)學(xué)習(xí)路徑《C 并發(fā)編程指南》的價(jià)值在于它提供了一條從概念到實(shí)戰(zhàn)、從語(yǔ)言設(shè)施到底層模型的完整學(xué)習(xí)路徑先用第一章建立并發(fā) vs 并行的正確心智模型再用第二、三章掌握線程的創(chuàng)建與管理第四、五章學(xué)會(huì)用互斥量與條件變量保護(hù)共享數(shù)據(jù)第六、七章引入異步任務(wù)與原子類型第八章深入內(nèi)存序理解底層語(yǔ)義最后在第九至十一章中把這些設(shè)施綜合成正確的并發(fā)數(shù)據(jù)結(jié)構(gòu)和完整的應(yīng)用實(shí)例。對(duì)于想系統(tǒng)學(xué)習(xí) C11 并發(fā)編程、又不滿足于零散 API 例子的開(kāi)發(fā)者來(lái)說(shuō)沿著 目錄 逐章研讀并親手編譯 hello-world.cc就是最好的起點(diǎn)。贊分享教程并發(fā)編程【免費(fèi)下載鏈接】Cplusplus-Concurrency-In-PracticeA Detailed Cplusplus Concurrency Tutorial 《C 并發(fā)編程指南》項(xiàng)目地址https://gitcode.com/gh_mirrors/cp/Cplusplus-Concurrency-In-Practice點(diǎn)擊查看免費(fèi)下載相關(guān)推薦BAAI/bge-small-zh-v1.5未來(lái)展望中文文本嵌入技術(shù)的發(fā)展趨勢(shì)與路線圖BAAI/bge small zh v1.5未來(lái)展望中文文本嵌入技術(shù)的發(fā)展趨勢(shì)與路線圖 BAAI/bge small zh v1.5作為一款輕量級(jí)中文文本嵌入基礎(chǔ)模型NLPEmbedding解決Logitech Media Server常見(jiàn)問(wèn)題連接、播放與性能優(yōu)化指南解決Logitech Media Server常見(jiàn)問(wèn)題連接、播放與性能優(yōu)化指南 Logitech Media ServerLMS是一款功能強(qiáng)大的音頻服務(wù)器后端音視頻Taste-Skill無(wú)障礙設(shè)計(jì)指南讓你的UI兼容所有用戶需求Taste Skill無(wú)障礙設(shè)計(jì)指南讓你的UI兼容所有用戶需求 Taste Skill是一款專注于提升AI界面設(shè)計(jì)品味的前端框架它不僅能幫助開(kāi)發(fā)者創(chuàng)建美觀的AI 技能前端設(shè)計(jì)系統(tǒng)上一篇Video DownloadHelper CoApp一站式智能視頻下載解決方案下一篇Linux-Tutorial 實(shí)戰(zhàn)Zsh 與 oh-my-zsh 高效終端指南安裝、插件、主題與別名定制創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考