點(diǎn)擊上方“C語(yǔ)言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號(hào)”
干貨福利,第一時(shí)間送達(dá)!
最近有小伙伴說(shuō)沒(méi)有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,導(dǎo)致沒(méi)有星標(biāo)公眾號(hào)的小伙伴刷不到當(dāng)天推送的文章,無(wú)法接收到一些比較實(shí)用的知識(shí)和資訊。所以建議大家加個(gè)星標(biāo)??,以后就能第一時(shí)間收到推送了。
去年參加一個(gè)技術(shù)評(píng)審,有位同事很興奮地說(shuō):"我把服務(wù)里的線程池全換成了 C++20 協(xié)程,現(xiàn)在能開(kāi)幾萬(wàn)個(gè)協(xié)程并行跑任務(wù),性能直接起飛。"
我盯著他的代碼看了五分鐘,然后問(wèn)了一句:"你這十幾萬(wàn)個(gè)協(xié)程,跑在幾個(gè)線程上?"
他愣了一下:"協(xié)程不是自帶調(diào)度嗎?"
問(wèn)題就出在這里。協(xié)程不是線程,它甚至不負(fù)責(zé)并行。
C++20 協(xié)程的核心就三個(gè)關(guān)鍵字:co_await、co_yield、co_return。它們做的事情很簡(jiǎn)單:讓函數(shù)執(zhí)行到一半停下來(lái),等條件滿足后再?gòu)耐O碌牡胤嚼^續(xù)。
task<int> fetchData() {
auto conn = co_await connect(); // 暫停,等待連接完成
auto data = co_await conn.read(); // 再暫停,等待數(shù)據(jù)
co_return data;
}
看到?jīng)]有?這里沒(méi)有創(chuàng)建任何線程。co_await 只是告訴編譯器:"我先讓出執(zhí)行權(quán),等這個(gè)異步操作完了再回來(lái)。" 整個(gè)過(guò)程可能完全在同一個(gè)線程里串行發(fā)生。

很多人把協(xié)程叫做"輕量級(jí)線程"或"綠色線程",這個(gè)類比害人不淺。
std::thread) | ||
|---|---|---|
關(guān)鍵區(qū)別在第三行:線程是真正的并行執(zhí)行單元,協(xié)程不是。
如果你只有一個(gè)線程,即使里面跑著一萬(wàn)個(gè)協(xié)程,任意時(shí)刻也只有一個(gè)協(xié)程在執(zhí)行。它們不會(huì)像線程那樣被 CPU 同時(shí)調(diào)度到不同核上。

協(xié)程解決的不是 "怎么跑得更快",而是 "怎么在等待 I/O 的時(shí)候不浪費(fèi) CPU"。
想象一個(gè)網(wǎng)絡(luò)服務(wù)器要處理十萬(wàn)個(gè)連接。如果你用線程,每個(gè)連接一個(gè)線程,內(nèi)核很快就被切換開(kāi)銷打跡了。如果你用協(xié)程,一個(gè)線程里掛上十萬(wàn)個(gè)協(xié)程,某個(gè)協(xié)程在等數(shù)據(jù)庫(kù)返回時(shí),它主動(dòng)讓出執(zhí)行權(quán),同一個(gè)線程馬上去執(zhí)行下一個(gè)協(xié)程。
// 同一個(gè)線程里,三個(gè)協(xié)程交替執(zhí)行
auto t1 = handleRequest(conn1); // 執(zhí)行到 co_await 讓出
auto t2 = handleRequest(conn2); // 立刻接手
auto t3 = handleRequest(conn3); // 再接手
這不是并行,是單線程上的多任務(wù)切換。它省的是內(nèi)存和上下文切換開(kāi)銷,不是 CPU 計(jì)算能力。
面試?yán)镞@個(gè)問(wèn)題被問(wèn)得很頻,答錯(cuò)的人大概分三類:

C++20 協(xié)程是一個(gè)強(qiáng)大的工具,但工具的第一原則是用對(duì)地方。它解決的是單線程內(nèi)的高并發(fā)調(diào)度,而不是多核并行計(jì)算。
記住這句話:協(xié)程是函數(shù)的"暫停鍵",線程是操作系統(tǒng)的"執(zhí)行單位"?;煜诉@兩者,你的架構(gòu)設(shè)計(jì)從第一步就偏了。
C++ 校招 / 社招跳槽逆襲!從0到1打造高含金量項(xiàng)目,導(dǎo)師1v1輔導(dǎo),助你斬獲大廠offer!
很多同學(xué)準(zhǔn)備校招時(shí)最焦慮的問(wèn)題就是:“簡(jiǎn)歷沒(méi)項(xiàng)目,怎么打動(dòng)面試官?”
為了解決這個(gè)痛點(diǎn),我們推出了C++訓(xùn)練營(yíng),來(lái)了!

在這里,你可以:
我們不只是教你寫代碼,更帶你走一遍完整的項(xiàng)目流程: 從需求分析、架構(gòu)設(shè)計(jì)、編譯調(diào)試,到版本管理、測(cè)試發(fā)布,全流程掌握!
項(xiàng)目配套資料齊全,遇到問(wèn)題還有導(dǎo)師幫你答疑,不怕卡殼!
項(xiàng)目準(zhǔn)備好了,你只差一次出發(fā)。
相信我,這些項(xiàng)目絕對(duì)能夠讓你進(jìn)步巨大!下面是其中某三個(gè)項(xiàng)目的說(shuō)明文檔

訓(xùn)練營(yíng)適用人群:
不適合人群:

1、C++訓(xùn)練營(yíng),來(lái)了!
2、HarmonyOS 學(xué)習(xí)資料分享(無(wú)套路免費(fèi)分享)
我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進(jìn)群交流。
歡迎你添加我的微信,我拉你進(jìn)技術(shù)交流群。此外,我也會(huì)經(jīng)常在微信上分享一些計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)以及工作體驗(yàn),還有一些內(nèi)推機(jī)會(huì)。
加個(gè)微信,打開(kāi)另一扇窗
感謝你的分享,點(diǎn)贊,在看三連