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