[{"data":1,"prerenderedAt":3912},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3468,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3896,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3911},{"id":4,"title":5,"body":6,"canonicalPath":3449,"chapterDepth":65,"chapterOrder":3450,"date":3451,"description":3452,"docI18nKey":3453,"docKey":3454,"docRoot":3455,"docTitle":3456,"extension":3457,"i18nKey":3458,"isBlogPost":3459,"isWikiDoc":251,"isWikiIndex":3459,"layout":3460,"legacyPath":3460,"locale":3461,"localeSlug":3462,"meta":3463,"navigation":251,"path":3449,"seo":3464,"sourcePath":3465,"sourceStem":3458,"stem":3466,"wikiDepth":54,"__hash__":3467},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise.md","future、async、promise 与 packaged_task",{"type":7,"value":8,"toc":3407},"minimark",[9,17,24,29,34,41,95,98,108,117,122,130,133,149,156,159,173,178,219,226,456,459,475,478,490,493,507,510,513,519,530,533,549,552,560,568,573,576,581,589,594,605,610,617,641,644,647,652,658,682,685,688,710,713,715,930,941,945,948,971,974,980,983,998,1001,1009,1019,1091,1097,1100,1113,1116,1124,1137,1140,1143,1156,1158,1212,1220,1260,1263,1302,1305,1528,1532,1541,1544,1738,1741,1753,1756,1759,1766,1771,1774,1780,1783,1798,1801,1803,2000,2007,2023,2026,2033,2047,2050,2057,2070,2073,2080,2083,2141,2144,2157,2160,2163,2475,2479,2485,2496,2499,2510,2513,2516,2518,2589,2596,2601,2606,2608,2785,2787,2813,2816,2822,2830,2996,3001,3017,3020,3026,3035,3040,3045,3050,3055,3057,3063,3070,3075,3087,3090,3093,3112,3115,3180,3183,3197,3200,3209,3212,3218,3221,3240,3242,3248,3251,3269,3272,3276,3285,3295,3303,3318,3329,3336,3340,3350,3357,3364,3371,3378,3385,3392,3403],[10,11,12,16],"p",{},[13,14,15],"code",{},"std::thread"," 很适合表达“启动一个线程”，但它本身不直接提供：",[18,19,20],"ul",{},[21,22,23],"li",{},"线程函数返回值；",[18,25,26],{},[21,27,28],{},"异常自动传回调用方；",[18,30,31],{},[21,32,33],{},"一个统一的“未来结果”对象。",[10,35,36,37,40],{},"C++11 在 ",[13,38,39],{},"\u003Cfuture>"," 中提供了一组更偏“任务”的并发工具：",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-cpp shiki shiki-themes github-light github-dark","std::future\nstd::async\nstd::promise\nstd::packaged_task\nstd::shared_future\n","cpp","",[13,49,50,63,71,79,87],{"__ignoreMap":47},[51,52,55,59],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sScJk","std",[51,60,62],{"class":61},"sVt8B","::future\n",[51,64,66,68],{"class":53,"line":65},2,[51,67,58],{"class":57},[51,69,70],{"class":61},"::async\n",[51,72,74,76],{"class":53,"line":73},3,[51,75,58],{"class":57},[51,77,78],{"class":61},"::promise\n",[51,80,82,84],{"class":53,"line":81},4,[51,83,58],{"class":57},[51,85,86],{"class":61},"::packaged_task\n",[51,88,90,92],{"class":53,"line":89},5,[51,91,58],{"class":57},[51,93,94],{"class":61},"::shared_future\n",[10,96,97],{},"它们的核心思想是：",[99,100,101],"blockquote",{},[10,102,103,104,107],{},"某个结果现在还没有，但未来会产生；调用方先拿到一个 ",[13,105,106],{},"future","，之后再等待或取得结果。",[109,110,112,113,116],"h2",{"id":111},"_1-stdfuturet-是什么","1. ",[13,114,115],{},"std::future\u003CT>"," 是什么",[10,118,119,121],{},[13,120,115],{}," 表示：",[42,123,128],{"className":124,"code":126,"language":127,"meta":47},[125],"language-text","未来某个时刻会得到一个 T\n","text",[13,129,126],{"__ignoreMap":47},[10,131,132],{},"For example:",[42,134,136],{"className":44,"code":135,"language":46,"meta":47,"style":47},"std::future\u003Cint>\n",[13,137,138],{"__ignoreMap":47},[51,139,140,142,145],{"class":53,"line":54},[51,141,58],{"class":57},[51,143,144],{"class":61},"::future",[51,146,148],{"class":147},"szBVR","\u003Cint>\n",[10,150,151,152,155],{},"表示未来会产生一个 ",[13,153,154],{},"int","。",[10,157,158],{},"如果任务没有返回值，则使用：",[42,160,162],{"className":44,"code":161,"language":46,"meta":47,"style":47},"std::future\u003Cvoid>\n",[13,163,164],{"__ignoreMap":47},[51,165,166,168,170],{"class":53,"line":54},[51,167,58],{"class":57},[51,169,144],{"class":61},[51,171,172],{"class":147},"\u003Cvoid>\n",[10,174,175,177],{},[13,176,106],{}," 最重要的成员函数包括：",[42,179,181],{"className":44,"code":180,"language":46,"meta":47,"style":47},"get()\nwait()\nwait_for()\nwait_until()\nvalid()\n",[13,182,183,191,198,205,212],{"__ignoreMap":47},[51,184,185,188],{"class":53,"line":54},[51,186,187],{"class":57},"get",[51,189,190],{"class":61},"()\n",[51,192,193,196],{"class":53,"line":65},[51,194,195],{"class":57},"wait",[51,197,190],{"class":61},[51,199,200,203],{"class":53,"line":73},[51,201,202],{"class":57},"wait_for",[51,204,190],{"class":61},[51,206,207,210],{"class":53,"line":81},[51,208,209],{"class":57},"wait_until",[51,211,190],{"class":61},[51,213,214,217],{"class":53,"line":89},[51,215,216],{"class":57},"valid",[51,218,190],{"class":61},[109,220,222,223],{"id":221},"_2-最简单的-stdasync","2. 最简单的 ",[13,224,225],{},"std::async",[42,227,229],{"className":44,"code":228,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n\nint calculate(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    std::future\u003Cint> result = std::async(\n        std::launch::async,\n        calculate,\n        10,\n        20);\n\n    std::cout \u003C\u003C \"main continues\\n\";\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,230,231,240,247,253,280,285,300,306,311,321,326,355,369,375,385,394,399,422,451],{"__ignoreMap":47},[51,232,233,236],{"class":53,"line":54},[51,234,235],{"class":147},"#include",[51,237,239],{"class":238},"sZZnC"," \u003Cfuture>\n",[51,241,242,244],{"class":53,"line":65},[51,243,235],{"class":147},[51,245,246],{"class":238}," \u003Ciostream>\n",[51,248,249],{"class":53,"line":73},[51,250,252],{"emptyLinePlaceholder":251},true,"\n",[51,254,255,257,260,263,265,269,272,274,277],{"class":53,"line":81},[51,256,154],{"class":147},[51,258,259],{"class":57}," calculate",[51,261,262],{"class":61},"(",[51,264,154],{"class":147},[51,266,268],{"class":267},"s4XuR"," a",[51,270,271],{"class":61},", ",[51,273,154],{"class":147},[51,275,276],{"class":267}," b",[51,278,279],{"class":61},")\n",[51,281,282],{"class":53,"line":89},[51,283,284],{"class":61},"{\n",[51,286,288,291,294,297],{"class":53,"line":287},6,[51,289,290],{"class":147},"    return",[51,292,293],{"class":61}," a ",[51,295,296],{"class":147},"+",[51,298,299],{"class":61}," b;\n",[51,301,303],{"class":53,"line":302},7,[51,304,305],{"class":61},"}\n",[51,307,309],{"class":53,"line":308},8,[51,310,252],{"emptyLinePlaceholder":251},[51,312,314,316,319],{"class":53,"line":313},9,[51,315,154],{"class":147},[51,317,318],{"class":57}," main",[51,320,190],{"class":61},[51,322,324],{"class":53,"line":323},10,[51,325,284],{"class":61},[51,327,329,332,334,337,340,343,346,349,352],{"class":53,"line":328},11,[51,330,331],{"class":57},"    std",[51,333,144],{"class":61},[51,335,336],{"class":147},"\u003Cint>",[51,338,339],{"class":61}," result ",[51,341,342],{"class":147},"=",[51,344,345],{"class":57}," std",[51,347,348],{"class":61},"::",[51,350,351],{"class":57},"async",[51,353,354],{"class":61},"(\n",[51,356,358,361,363,366],{"class":53,"line":357},12,[51,359,360],{"class":57},"        std",[51,362,348],{"class":61},[51,364,365],{"class":57},"launch",[51,367,368],{"class":61},"::async,\n",[51,370,372],{"class":53,"line":371},13,[51,373,374],{"class":61},"        calculate,\n",[51,376,378,382],{"class":53,"line":377},14,[51,379,381],{"class":380},"sj4cs","        10",[51,383,384],{"class":61},",\n",[51,386,388,391],{"class":53,"line":387},15,[51,389,390],{"class":380},"        20",[51,392,393],{"class":61},");\n",[51,395,397],{"class":53,"line":396},16,[51,398,252],{"emptyLinePlaceholder":251},[51,400,402,404,407,410,413,416,419],{"class":53,"line":401},17,[51,403,331],{"class":57},[51,405,406],{"class":61},"::cout ",[51,408,409],{"class":147},"\u003C\u003C",[51,411,412],{"class":238}," \"main continues",[51,414,415],{"class":380},"\\n",[51,417,418],{"class":238},"\"",[51,420,421],{"class":61},";\n",[51,423,425,427,429,431,434,436,439,441,444,446,449],{"class":53,"line":424},18,[51,426,331],{"class":57},[51,428,406],{"class":61},[51,430,409],{"class":147},[51,432,433],{"class":61}," result.",[51,435,187],{"class":57},[51,437,438],{"class":61},"() ",[51,440,409],{"class":147},[51,442,443],{"class":238}," '",[51,445,415],{"class":380},[51,447,448],{"class":238},"'",[51,450,421],{"class":61},[51,452,454],{"class":53,"line":453},19,[51,455,305],{"class":61},[10,457,458],{},"这里：",[42,460,462],{"className":44,"code":461,"language":46,"meta":47,"style":47},"std::async(...)\n",[13,463,464],{"__ignoreMap":47},[51,465,466,468,470,472],{"class":53,"line":54},[51,467,58],{"class":57},[51,469,348],{"class":61},[51,471,351],{"class":57},[51,473,474],{"class":61},"(...)\n",[10,476,477],{},"启动一个异步任务，并返回：",[42,479,480],{"className":44,"code":135,"language":46,"meta":47,"style":47},[13,481,482],{"__ignoreMap":47},[51,483,484,486,488],{"class":53,"line":54},[51,485,58],{"class":57},[51,487,144],{"class":61},[51,489,148],{"class":147},[10,491,492],{},"调用：",[42,494,496],{"className":44,"code":495,"language":46,"meta":47,"style":47},"result.get()\n",[13,497,498],{"__ignoreMap":47},[51,499,500,503,505],{"class":53,"line":54},[51,501,502],{"class":61},"result.",[51,504,187],{"class":57},[51,506,190],{"class":61},[10,508,509],{},"时，如果结果还没准备好，当前线程会等待；准备好后取得返回值。",[10,511,512],{},"输出可能是：",[42,514,517],{"className":515,"code":516,"language":127,"meta":47},[125],"main continues\n30\n",[13,518,516],{"__ignoreMap":47},[109,520,522,523,525,526,529],{"id":521},"_3-async-的参数和-thread-很像","3. ",[13,524,351],{}," 的参数和 ",[13,527,528],{},"thread"," 很像",[10,531,532],{},"概念上：",[42,534,536],{"className":44,"code":535,"language":46,"meta":47,"style":47},"std::async(policy, callable, arg1, arg2, ...)\n",[13,537,538],{"__ignoreMap":47},[51,539,540,542,544,546],{"class":53,"line":54},[51,541,58],{"class":57},[51,543,348],{"class":61},[51,545,351],{"class":57},[51,547,548],{"class":61},"(policy, callable, arg1, arg2, ...)\n",[10,550,551],{},"Among them:",[18,553,554],{},[21,555,556,559],{},[13,557,558],{},"policy","：启动策略；",[18,561,562],{},[21,563,564,567],{},[13,565,566],{},"callable","：要执行的可调用对象；",[18,569,570],{},[21,571,572],{},"后续参数：传给该可调用对象。",[10,574,575],{},"可调用对象同样可以是：",[18,577,578],{},[21,579,580],{},"普通函数；",[18,582,583,586],{},[21,584,585],{},"Lambda；",[21,587,588],{},"函数对象；",[18,590,591],{},[21,592,593],{},"成员函数。",[109,595,597,598,601,602],{"id":596},"_4-stdlaunchasync-和-stdlaunchdeferred","4. ",[13,599,600],{},"std::launch::async"," 和 ",[13,603,604],{},"std::launch::deferred",[10,606,607,609],{},[13,608,225],{}," 支持两种重要启动策略。",[611,612,614,615],"h3",{"id":613},"_41-stdlaunchasync","4.1 ",[13,616,600],{},[42,618,620],{"className":44,"code":619,"language":46,"meta":47,"style":47},"std::async(std::launch::async, task);\n",[13,621,622],{"__ignoreMap":47},[51,623,624,626,628,630,632,634,636,638],{"class":53,"line":54},[51,625,58],{"class":57},[51,627,348],{"class":61},[51,629,351],{"class":57},[51,631,262],{"class":61},[51,633,58],{"class":57},[51,635,348],{"class":61},[51,637,365],{"class":57},[51,639,640],{"class":61},"::async, task);\n",[10,642,643],{},"要求任务异步执行。",[10,645,646],{},"可以把它理解成：",[99,648,649],{},[10,650,651],{},"现在就安排任务独立执行。",[611,653,655,656],{"id":654},"_42-stdlaunchdeferred","4.2 ",[13,657,604],{},[42,659,661],{"className":44,"code":660,"language":46,"meta":47,"style":47},"std::async(std::launch::deferred, task);\n",[13,662,663],{"__ignoreMap":47},[51,664,665,667,669,671,673,675,677,679],{"class":53,"line":54},[51,666,58],{"class":57},[51,668,348],{"class":61},[51,670,351],{"class":57},[51,672,262],{"class":61},[51,674,58],{"class":57},[51,676,348],{"class":61},[51,678,365],{"class":57},[51,680,681],{"class":61},"::deferred, task);\n",[10,683,684],{},"表示延迟执行。",[10,686,687],{},"任务不会立刻运行，而是在第一次：",[42,689,691],{"className":44,"code":690,"language":46,"meta":47,"style":47},"future.get()\nfuture.wait()\n",[13,692,693,702],{"__ignoreMap":47},[51,694,695,698,700],{"class":53,"line":54},[51,696,697],{"class":61},"future.",[51,699,187],{"class":57},[51,701,190],{"class":61},[51,703,704,706,708],{"class":53,"line":65},[51,705,697],{"class":61},[51,707,195],{"class":57},[51,709,190],{"class":61},[10,711,712],{},"时，由调用这些函数的线程执行。",[10,714,132],{},[42,716,718],{"className":44,"code":717,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nint task()\n{\n    std::cout \u003C\u003C \"task thread: \"\n              \u003C\u003C std::this_thread::get_id()\n              \u003C\u003C '\\n';\n    return 42;\n}\n\nint main()\n{\n    std::cout \u003C\u003C \"main thread: \"\n              \u003C\u003C std::this_thread::get_id()\n              \u003C\u003C '\\n';\n\n    auto result = std::async(std::launch::deferred, task);\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,719,720,726,732,739,743,752,756,767,786,798,807,811,815,823,827,838,854,866,870,895,900,925],{"__ignoreMap":47},[51,721,722,724],{"class":53,"line":54},[51,723,235],{"class":147},[51,725,239],{"class":238},[51,727,728,730],{"class":53,"line":65},[51,729,235],{"class":147},[51,731,246],{"class":238},[51,733,734,736],{"class":53,"line":73},[51,735,235],{"class":147},[51,737,738],{"class":238}," \u003Cthread>\n",[51,740,741],{"class":53,"line":81},[51,742,252],{"emptyLinePlaceholder":251},[51,744,745,747,750],{"class":53,"line":89},[51,746,154],{"class":147},[51,748,749],{"class":57}," task",[51,751,190],{"class":61},[51,753,754],{"class":53,"line":287},[51,755,284],{"class":61},[51,757,758,760,762,764],{"class":53,"line":302},[51,759,331],{"class":57},[51,761,406],{"class":61},[51,763,409],{"class":147},[51,765,766],{"class":238}," \"task thread: \"\n",[51,768,769,772,774,776,779,781,784],{"class":53,"line":308},[51,770,771],{"class":147},"              \u003C\u003C",[51,773,345],{"class":57},[51,775,348],{"class":61},[51,777,778],{"class":57},"this_thread",[51,780,348],{"class":61},[51,782,783],{"class":57},"get_id",[51,785,190],{"class":61},[51,787,788,790,792,794,796],{"class":53,"line":313},[51,789,771],{"class":147},[51,791,443],{"class":238},[51,793,415],{"class":380},[51,795,448],{"class":238},[51,797,421],{"class":61},[51,799,800,802,805],{"class":53,"line":323},[51,801,290],{"class":147},[51,803,804],{"class":380}," 42",[51,806,421],{"class":61},[51,808,809],{"class":53,"line":328},[51,810,305],{"class":61},[51,812,813],{"class":53,"line":357},[51,814,252],{"emptyLinePlaceholder":251},[51,816,817,819,821],{"class":53,"line":371},[51,818,154],{"class":147},[51,820,318],{"class":57},[51,822,190],{"class":61},[51,824,825],{"class":53,"line":377},[51,826,284],{"class":61},[51,828,829,831,833,835],{"class":53,"line":387},[51,830,331],{"class":57},[51,832,406],{"class":61},[51,834,409],{"class":147},[51,836,837],{"class":238}," \"main thread: \"\n",[51,839,840,842,844,846,848,850,852],{"class":53,"line":396},[51,841,771],{"class":147},[51,843,345],{"class":57},[51,845,348],{"class":61},[51,847,778],{"class":57},[51,849,348],{"class":61},[51,851,783],{"class":57},[51,853,190],{"class":61},[51,855,856,858,860,862,864],{"class":53,"line":401},[51,857,771],{"class":147},[51,859,443],{"class":238},[51,861,415],{"class":380},[51,863,448],{"class":238},[51,865,421],{"class":61},[51,867,868],{"class":53,"line":424},[51,869,252],{"emptyLinePlaceholder":251},[51,871,872,875,877,879,881,883,885,887,889,891,893],{"class":53,"line":453},[51,873,874],{"class":147},"    auto",[51,876,339],{"class":61},[51,878,342],{"class":147},[51,880,345],{"class":57},[51,882,348],{"class":61},[51,884,351],{"class":57},[51,886,262],{"class":61},[51,888,58],{"class":57},[51,890,348],{"class":61},[51,892,365],{"class":57},[51,894,681],{"class":61},[51,896,898],{"class":53,"line":897},20,[51,899,252],{"emptyLinePlaceholder":251},[51,901,903,905,907,909,911,913,915,917,919,921,923],{"class":53,"line":902},21,[51,904,331],{"class":57},[51,906,406],{"class":61},[51,908,409],{"class":147},[51,910,433],{"class":61},[51,912,187],{"class":57},[51,914,438],{"class":61},[51,916,409],{"class":147},[51,918,443],{"class":238},[51,920,415],{"class":380},[51,922,448],{"class":238},[51,924,421],{"class":61},[51,926,928],{"class":53,"line":927},22,[51,929,305],{"class":61},[10,931,932,933,936,937,940],{},"这里 ",[13,934,935],{},"task()"," 会在调用 ",[13,938,939],{},"get()"," 的线程中执行。",[109,942,944],{"id":943},"_5-不写-policy-会怎样","5. 不写 policy 会怎样",[10,946,947],{},"Yes, you can write:",[42,949,951],{"className":44,"code":950,"language":46,"meta":47,"style":47},"auto result = std::async(task);\n",[13,952,953],{"__ignoreMap":47},[51,954,955,958,960,962,964,966,968],{"class":53,"line":54},[51,956,957],{"class":147},"auto",[51,959,339],{"class":61},[51,961,342],{"class":147},[51,963,345],{"class":57},[51,965,348],{"class":61},[51,967,351],{"class":57},[51,969,970],{"class":61},"(task);\n",[10,972,973],{},"此时标准库允许实现选择：",[42,975,978],{"className":976,"code":977,"language":127,"meta":47},[125],"async\n或\ndeferred\n",[13,979,977],{"__ignoreMap":47},[10,981,982],{},"因此，如果你明确要求任务真正异步执行，建议显式写：",[42,984,986],{"className":44,"code":985,"language":46,"meta":47,"style":47},"std::launch::async\n",[13,987,988],{"__ignoreMap":47},[51,989,990,992,994,996],{"class":53,"line":54},[51,991,58],{"class":57},[51,993,348],{"class":61},[51,995,365],{"class":57},[51,997,70],{"class":61},[10,999,1000],{},"否则不要假设“不写策略就一定创建新线程”。",[109,1002,1004,1005,1008],{"id":1003},"_6-futureget-只能取得一次","6. ",[13,1006,1007],{},"future::get()"," 只能取得一次",[10,1010,1011,1012,1015,1016,1018],{},"普通 ",[13,1013,1014],{},"std::future"," 的结果通常只能 ",[13,1017,939],{}," 一次：",[42,1020,1022],{"className":44,"code":1021,"language":46,"meta":47,"style":47},"auto result = std::async(std::launch::async, [] {\n    return 42;\n});\n\nint value = result.get();\n\u002F\u002F result.get(); \u002F\u002F 不应再次 get\n",[13,1023,1024,1049,1057,1062,1066,1082],{"__ignoreMap":47},[51,1025,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046],{"class":53,"line":54},[51,1027,957],{"class":147},[51,1029,339],{"class":61},[51,1031,342],{"class":147},[51,1033,345],{"class":57},[51,1035,348],{"class":61},[51,1037,351],{"class":57},[51,1039,262],{"class":61},[51,1041,58],{"class":57},[51,1043,348],{"class":61},[51,1045,365],{"class":57},[51,1047,1048],{"class":61},"::async, [] {\n",[51,1050,1051,1053,1055],{"class":53,"line":65},[51,1052,290],{"class":147},[51,1054,804],{"class":380},[51,1056,421],{"class":61},[51,1058,1059],{"class":53,"line":73},[51,1060,1061],{"class":61},"});\n",[51,1063,1064],{"class":53,"line":81},[51,1065,252],{"emptyLinePlaceholder":251},[51,1067,1068,1070,1073,1075,1077,1079],{"class":53,"line":89},[51,1069,154],{"class":147},[51,1071,1072],{"class":61}," value ",[51,1074,342],{"class":147},[51,1076,433],{"class":61},[51,1078,187],{"class":57},[51,1080,1081],{"class":61},"();\n",[51,1083,1084,1088],{"class":53,"line":287},[51,1085,1087],{"class":1086},"sJ8bj","\u002F\u002F result.get();",[51,1089,1090],{"class":1086}," \u002F\u002F 不应再次 get\n",[10,1092,1093,1094,1096],{},"第一次 ",[13,1095,939],{}," 后，future 通常不再关联共享状态。",[10,1098,1099],{},"可以用：",[42,1101,1103],{"className":44,"code":1102,"language":46,"meta":47,"style":47},"result.valid()\n",[13,1104,1105],{"__ignoreMap":47},[51,1106,1107,1109,1111],{"class":53,"line":54},[51,1108,502],{"class":61},[51,1110,216],{"class":57},[51,1112,190],{"class":61},[10,1114,1115],{},"检查它是否仍然关联有效状态。",[109,1117,1119,1120,1123],{"id":1118},"_7-wait只等待不取结果","7. ",[13,1121,1122],{},"wait()","：只等待，不取结果",[42,1125,1127],{"className":44,"code":1126,"language":46,"meta":47,"style":47},"future.wait();\n",[13,1128,1129],{"__ignoreMap":47},[51,1130,1131,1133,1135],{"class":53,"line":54},[51,1132,697],{"class":61},[51,1134,195],{"class":57},[51,1136,1081],{"class":61},[10,1138,1139],{},"只等待任务完成，不消费结果。",[10,1141,1142],{},"之后仍然可以：",[42,1144,1146],{"className":44,"code":1145,"language":46,"meta":47,"style":47},"future.get();\n",[13,1147,1148],{"__ignoreMap":47},[51,1149,1150,1152,1154],{"class":53,"line":54},[51,1151,697],{"class":61},[51,1153,187],{"class":57},[51,1155,1081],{"class":61},[10,1157,132],{},[42,1159,1161],{"className":44,"code":1160,"language":46,"meta":47,"style":47},"result.wait();\nstd::cout \u003C\u003C \"ready\\n\";\nstd::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n",[13,1162,1163,1171,1188],{"__ignoreMap":47},[51,1164,1165,1167,1169],{"class":53,"line":54},[51,1166,502],{"class":61},[51,1168,195],{"class":57},[51,1170,1081],{"class":61},[51,1172,1173,1175,1177,1179,1182,1184,1186],{"class":53,"line":65},[51,1174,58],{"class":57},[51,1176,406],{"class":61},[51,1178,409],{"class":147},[51,1180,1181],{"class":238}," \"ready",[51,1183,415],{"class":380},[51,1185,418],{"class":238},[51,1187,421],{"class":61},[51,1189,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210],{"class":53,"line":73},[51,1191,58],{"class":57},[51,1193,406],{"class":61},[51,1195,409],{"class":147},[51,1197,433],{"class":61},[51,1199,187],{"class":57},[51,1201,438],{"class":61},[51,1203,409],{"class":147},[51,1205,443],{"class":238},[51,1207,415],{"class":380},[51,1209,448],{"class":238},[51,1211,421],{"class":61},[109,1213,1215,1216,1219],{"id":1214},"_8-wait_for等待一段时间","8. ",[13,1217,1218],{},"wait_for()","：等待一段时间",[42,1221,1223],{"className":44,"code":1222,"language":46,"meta":47,"style":47},"auto status = result.wait_for(std::chrono::milliseconds(100));\n",[13,1224,1225],{"__ignoreMap":47},[51,1226,1227,1229,1232,1234,1236,1238,1240,1242,1244,1247,1249,1252,1254,1257],{"class":53,"line":54},[51,1228,957],{"class":147},[51,1230,1231],{"class":61}," status ",[51,1233,342],{"class":147},[51,1235,433],{"class":61},[51,1237,202],{"class":57},[51,1239,262],{"class":61},[51,1241,58],{"class":57},[51,1243,348],{"class":61},[51,1245,1246],{"class":57},"chrono",[51,1248,348],{"class":61},[51,1250,1251],{"class":57},"milliseconds",[51,1253,262],{"class":61},[51,1255,1256],{"class":380},"100",[51,1258,1259],{"class":61},"));\n",[10,1261,1262],{},"返回：",[42,1264,1266],{"className":44,"code":1265,"language":46,"meta":47,"style":47},"std::future_status::ready\nstd::future_status::timeout\nstd::future_status::deferred\n",[13,1267,1268,1280,1291],{"__ignoreMap":47},[51,1269,1270,1272,1274,1277],{"class":53,"line":54},[51,1271,58],{"class":57},[51,1273,348],{"class":61},[51,1275,1276],{"class":57},"future_status",[51,1278,1279],{"class":61},"::ready\n",[51,1281,1282,1284,1286,1288],{"class":53,"line":65},[51,1283,58],{"class":57},[51,1285,348],{"class":61},[51,1287,1276],{"class":57},[51,1289,1290],{"class":61},"::timeout\n",[51,1292,1293,1295,1297,1299],{"class":53,"line":73},[51,1294,58],{"class":57},[51,1296,348],{"class":61},[51,1298,1276],{"class":57},[51,1300,1301],{"class":61},"::deferred\n",[10,1303,1304],{},"Example:",[42,1306,1308],{"className":44,"code":1307,"language":46,"meta":47,"style":47},"#include \u003Cchrono>\n#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nusing namespace std::chrono_literals;\n\nint main()\n{\n    auto result = std::async(std::launch::async, [] {\n        std::this_thread::sleep_for(1s);\n        return 42;\n    });\n\n    if (result.wait_for(100ms) == std::future_status::timeout)\n    {\n        std::cout \u003C\u003C \"not ready yet\\n\";\n    }\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,1309,1310,1317,1323,1329,1335,1339,1356,1360,1368,1372,1396,1419,1428,1433,1437,1469,1474,1491,1496,1500,1524],{"__ignoreMap":47},[51,1311,1312,1314],{"class":53,"line":54},[51,1313,235],{"class":147},[51,1315,1316],{"class":238}," \u003Cchrono>\n",[51,1318,1319,1321],{"class":53,"line":65},[51,1320,235],{"class":147},[51,1322,239],{"class":238},[51,1324,1325,1327],{"class":53,"line":73},[51,1326,235],{"class":147},[51,1328,246],{"class":238},[51,1330,1331,1333],{"class":53,"line":81},[51,1332,235],{"class":147},[51,1334,738],{"class":238},[51,1336,1337],{"class":53,"line":89},[51,1338,252],{"emptyLinePlaceholder":251},[51,1340,1341,1344,1347,1349,1351,1354],{"class":53,"line":287},[51,1342,1343],{"class":147},"using",[51,1345,1346],{"class":147}," namespace",[51,1348,345],{"class":57},[51,1350,348],{"class":61},[51,1352,1353],{"class":57},"chrono_literals",[51,1355,421],{"class":61},[51,1357,1358],{"class":53,"line":302},[51,1359,252],{"emptyLinePlaceholder":251},[51,1361,1362,1364,1366],{"class":53,"line":308},[51,1363,154],{"class":147},[51,1365,318],{"class":57},[51,1367,190],{"class":61},[51,1369,1370],{"class":53,"line":313},[51,1371,284],{"class":61},[51,1373,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394],{"class":53,"line":323},[51,1375,874],{"class":147},[51,1377,339],{"class":61},[51,1379,342],{"class":147},[51,1381,345],{"class":57},[51,1383,348],{"class":61},[51,1385,351],{"class":57},[51,1387,262],{"class":61},[51,1389,58],{"class":57},[51,1391,348],{"class":61},[51,1393,365],{"class":57},[51,1395,1048],{"class":61},[51,1397,1398,1400,1402,1404,1406,1409,1411,1414,1417],{"class":53,"line":328},[51,1399,360],{"class":57},[51,1401,348],{"class":61},[51,1403,778],{"class":57},[51,1405,348],{"class":61},[51,1407,1408],{"class":57},"sleep_for",[51,1410,262],{"class":61},[51,1412,1413],{"class":380},"1",[51,1415,1416],{"class":147},"s",[51,1418,393],{"class":61},[51,1420,1421,1424,1426],{"class":53,"line":357},[51,1422,1423],{"class":147},"        return",[51,1425,804],{"class":380},[51,1427,421],{"class":61},[51,1429,1430],{"class":53,"line":371},[51,1431,1432],{"class":61},"    });\n",[51,1434,1435],{"class":53,"line":377},[51,1436,252],{"emptyLinePlaceholder":251},[51,1438,1439,1442,1445,1447,1449,1451,1454,1457,1460,1462,1464,1466],{"class":53,"line":387},[51,1440,1441],{"class":147},"    if",[51,1443,1444],{"class":61}," (result.",[51,1446,202],{"class":57},[51,1448,262],{"class":61},[51,1450,1256],{"class":380},[51,1452,1453],{"class":147},"ms",[51,1455,1456],{"class":61},") ",[51,1458,1459],{"class":147},"==",[51,1461,345],{"class":57},[51,1463,348],{"class":61},[51,1465,1276],{"class":57},[51,1467,1468],{"class":61},"::timeout)\n",[51,1470,1471],{"class":53,"line":396},[51,1472,1473],{"class":61},"    {\n",[51,1475,1476,1478,1480,1482,1485,1487,1489],{"class":53,"line":401},[51,1477,360],{"class":57},[51,1479,406],{"class":61},[51,1481,409],{"class":147},[51,1483,1484],{"class":238}," \"not ready yet",[51,1486,415],{"class":380},[51,1488,418],{"class":238},[51,1490,421],{"class":61},[51,1492,1493],{"class":53,"line":424},[51,1494,1495],{"class":61},"    }\n",[51,1497,1498],{"class":53,"line":453},[51,1499,252],{"emptyLinePlaceholder":251},[51,1501,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522],{"class":53,"line":897},[51,1503,331],{"class":57},[51,1505,406],{"class":61},[51,1507,409],{"class":147},[51,1509,433],{"class":61},[51,1511,187],{"class":57},[51,1513,438],{"class":61},[51,1515,409],{"class":147},[51,1517,443],{"class":238},[51,1519,415],{"class":380},[51,1521,448],{"class":238},[51,1523,421],{"class":61},[51,1525,1526],{"class":53,"line":902},[51,1527,305],{"class":61},[109,1529,1531],{"id":1530},"_9-异常会通过-future-传播","9. 异常会通过 future 传播",[10,1533,1534,1535,1537,1538,1540],{},"这是 ",[13,1536,106],{}," 相比裸 ",[13,1539,15],{}," 很方便的一点。",[10,1542,1543],{},"如果异步任务抛异常：",[42,1545,1547],{"className":44,"code":1546,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cstdexcept>\n\nint main()\n{\n    auto result = std::async(std::launch::async, []() -> int {\n        throw std::runtime_error(\"task failed\");\n    });\n\n    try\n    {\n        std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n    }\n    catch (const std::exception& e)\n    {\n        std::cout \u003C\u003C e.what() \u003C\u003C '\\n';\n    }\n}\n",[13,1548,1549,1555,1561,1568,1572,1580,1584,1614,1633,1637,1641,1646,1650,1674,1678,1700,1704,1730,1734],{"__ignoreMap":47},[51,1550,1551,1553],{"class":53,"line":54},[51,1552,235],{"class":147},[51,1554,239],{"class":238},[51,1556,1557,1559],{"class":53,"line":65},[51,1558,235],{"class":147},[51,1560,246],{"class":238},[51,1562,1563,1565],{"class":53,"line":73},[51,1564,235],{"class":147},[51,1566,1567],{"class":238}," \u003Cstdexcept>\n",[51,1569,1570],{"class":53,"line":81},[51,1571,252],{"emptyLinePlaceholder":251},[51,1573,1574,1576,1578],{"class":53,"line":89},[51,1575,154],{"class":147},[51,1577,318],{"class":57},[51,1579,190],{"class":61},[51,1581,1582],{"class":53,"line":287},[51,1583,284],{"class":61},[51,1585,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1609,1611],{"class":53,"line":302},[51,1587,874],{"class":147},[51,1589,339],{"class":61},[51,1591,342],{"class":147},[51,1593,345],{"class":57},[51,1595,348],{"class":61},[51,1597,351],{"class":57},[51,1599,262],{"class":61},[51,1601,58],{"class":57},[51,1603,348],{"class":61},[51,1605,365],{"class":57},[51,1607,1608],{"class":61},"::async, []() -> ",[51,1610,154],{"class":147},[51,1612,1613],{"class":61}," {\n",[51,1615,1616,1619,1621,1623,1626,1628,1631],{"class":53,"line":308},[51,1617,1618],{"class":147},"        throw",[51,1620,345],{"class":57},[51,1622,348],{"class":61},[51,1624,1625],{"class":57},"runtime_error",[51,1627,262],{"class":61},[51,1629,1630],{"class":238},"\"task failed\"",[51,1632,393],{"class":61},[51,1634,1635],{"class":53,"line":313},[51,1636,1432],{"class":61},[51,1638,1639],{"class":53,"line":323},[51,1640,252],{"emptyLinePlaceholder":251},[51,1642,1643],{"class":53,"line":328},[51,1644,1645],{"class":147},"    try\n",[51,1647,1648],{"class":53,"line":357},[51,1649,1473],{"class":61},[51,1651,1652,1654,1656,1658,1660,1662,1664,1666,1668,1670,1672],{"class":53,"line":371},[51,1653,360],{"class":57},[51,1655,406],{"class":61},[51,1657,409],{"class":147},[51,1659,433],{"class":61},[51,1661,187],{"class":57},[51,1663,438],{"class":61},[51,1665,409],{"class":147},[51,1667,443],{"class":238},[51,1669,415],{"class":380},[51,1671,448],{"class":238},[51,1673,421],{"class":61},[51,1675,1676],{"class":53,"line":377},[51,1677,1495],{"class":61},[51,1679,1680,1683,1686,1689,1691,1694,1697],{"class":53,"line":387},[51,1681,1682],{"class":147},"    catch",[51,1684,1685],{"class":61}," (",[51,1687,1688],{"class":147},"const",[51,1690,345],{"class":57},[51,1692,1693],{"class":61},"::exception",[51,1695,1696],{"class":147},"&",[51,1698,1699],{"class":61}," e)\n",[51,1701,1702],{"class":53,"line":396},[51,1703,1473],{"class":61},[51,1705,1706,1708,1710,1712,1715,1718,1720,1722,1724,1726,1728],{"class":53,"line":401},[51,1707,360],{"class":57},[51,1709,406],{"class":61},[51,1711,409],{"class":147},[51,1713,1714],{"class":61}," e.",[51,1716,1717],{"class":57},"what",[51,1719,438],{"class":61},[51,1721,409],{"class":147},[51,1723,443],{"class":238},[51,1725,415],{"class":380},[51,1727,448],{"class":238},[51,1729,421],{"class":61},[51,1731,1732],{"class":53,"line":424},[51,1733,1495],{"class":61},[51,1735,1736],{"class":53,"line":453},[51,1737,305],{"class":61},[10,1739,1740],{},"异常会被保存到共享状态中，然后在：",[42,1742,1743],{"className":44,"code":495,"language":46,"meta":47,"style":47},[13,1744,1745],{"__ignoreMap":47},[51,1746,1747,1749,1751],{"class":53,"line":54},[51,1748,502],{"class":61},[51,1750,187],{"class":57},[51,1752,190],{"class":61},[10,1754,1755],{},"时重新抛出。",[10,1757,1758],{},"这比让工作线程自己想办法把错误传回主线程方便很多。",[109,1760,1762,1763],{"id":1761},"_10-stdpromiset","10. ",[13,1764,1765],{},"std::promise\u003CT>",[10,1767,1768,1770],{},[13,1769,1765],{}," 可以理解成 future 通道的“写入端”。",[10,1772,1773],{},"对应关系：",[42,1775,1778],{"className":1776,"code":1777,"language":127,"meta":47},[125],"promise\u003CT>  ----写入结果---->  shared state  ----读取结果----> future\u003CT>\n",[13,1779,1777],{"__ignoreMap":47},[10,1781,1782],{},"通过：",[42,1784,1786],{"className":44,"code":1785,"language":46,"meta":47,"style":47},"promise.get_future()\n",[13,1787,1788],{"__ignoreMap":47},[51,1789,1790,1793,1796],{"class":53,"line":54},[51,1791,1792],{"class":61},"promise.",[51,1794,1795],{"class":57},"get_future",[51,1797,190],{"class":61},[10,1799,1800],{},"取得与它关联的 future。",[10,1802,1304],{},[42,1804,1806],{"className":44,"code":1805,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nvoid producer(std::promise\u003Cint> promise)\n{\n    promise.set_value(42);\n}\n\nint main()\n{\n    std::promise\u003Cint> promise;\n    std::future\u003Cint> future = promise.get_future();\n\n    std::thread t(producer, std::move(promise));\n\n    std::cout \u003C\u003C future.get() \u003C\u003C '\\n';\n    t.join();\n}\n",[13,1807,1808,1814,1820,1826,1830,1859,1863,1878,1882,1886,1894,1898,1910,1930,1934,1957,1961,1986,1996],{"__ignoreMap":47},[51,1809,1810,1812],{"class":53,"line":54},[51,1811,235],{"class":147},[51,1813,239],{"class":238},[51,1815,1816,1818],{"class":53,"line":65},[51,1817,235],{"class":147},[51,1819,246],{"class":238},[51,1821,1822,1824],{"class":53,"line":73},[51,1823,235],{"class":147},[51,1825,738],{"class":238},[51,1827,1828],{"class":53,"line":81},[51,1829,252],{"emptyLinePlaceholder":251},[51,1831,1832,1835,1838,1840,1842,1844,1847,1850,1852,1855,1857],{"class":53,"line":89},[51,1833,1834],{"class":147},"void",[51,1836,1837],{"class":57}," producer",[51,1839,262],{"class":61},[51,1841,58],{"class":57},[51,1843,348],{"class":61},[51,1845,1846],{"class":57},"promise",[51,1848,1849],{"class":61},"\u003C",[51,1851,154],{"class":147},[51,1853,1854],{"class":61},"> ",[51,1856,1846],{"class":267},[51,1858,279],{"class":61},[51,1860,1861],{"class":53,"line":287},[51,1862,284],{"class":61},[51,1864,1865,1868,1871,1873,1876],{"class":53,"line":302},[51,1866,1867],{"class":61},"    promise.",[51,1869,1870],{"class":57},"set_value",[51,1872,262],{"class":61},[51,1874,1875],{"class":380},"42",[51,1877,393],{"class":61},[51,1879,1880],{"class":53,"line":308},[51,1881,305],{"class":61},[51,1883,1884],{"class":53,"line":313},[51,1885,252],{"emptyLinePlaceholder":251},[51,1887,1888,1890,1892],{"class":53,"line":323},[51,1889,154],{"class":147},[51,1891,318],{"class":57},[51,1893,190],{"class":61},[51,1895,1896],{"class":53,"line":328},[51,1897,284],{"class":61},[51,1899,1900,1902,1905,1907],{"class":53,"line":357},[51,1901,331],{"class":57},[51,1903,1904],{"class":61},"::promise",[51,1906,336],{"class":147},[51,1908,1909],{"class":61}," promise;\n",[51,1911,1912,1914,1916,1918,1921,1923,1926,1928],{"class":53,"line":371},[51,1913,331],{"class":57},[51,1915,144],{"class":61},[51,1917,336],{"class":147},[51,1919,1920],{"class":61}," future ",[51,1922,342],{"class":147},[51,1924,1925],{"class":61}," promise.",[51,1927,1795],{"class":57},[51,1929,1081],{"class":61},[51,1931,1932],{"class":53,"line":377},[51,1933,252],{"emptyLinePlaceholder":251},[51,1935,1936,1938,1941,1944,1947,1949,1951,1954],{"class":53,"line":387},[51,1937,331],{"class":57},[51,1939,1940],{"class":61},"::thread ",[51,1942,1943],{"class":57},"t",[51,1945,1946],{"class":61},"(producer, ",[51,1948,58],{"class":57},[51,1950,348],{"class":61},[51,1952,1953],{"class":57},"move",[51,1955,1956],{"class":61},"(promise));\n",[51,1958,1959],{"class":53,"line":396},[51,1960,252],{"emptyLinePlaceholder":251},[51,1962,1963,1965,1967,1969,1972,1974,1976,1978,1980,1982,1984],{"class":53,"line":401},[51,1964,331],{"class":57},[51,1966,406],{"class":61},[51,1968,409],{"class":147},[51,1970,1971],{"class":61}," future.",[51,1973,187],{"class":57},[51,1975,438],{"class":61},[51,1977,409],{"class":147},[51,1979,443],{"class":238},[51,1981,415],{"class":380},[51,1983,448],{"class":238},[51,1985,421],{"class":61},[51,1987,1988,1991,1994],{"class":53,"line":424},[51,1989,1990],{"class":61},"    t.",[51,1992,1993],{"class":57},"join",[51,1995,1081],{"class":61},[51,1997,1998],{"class":53,"line":453},[51,1999,305],{"class":61},[10,2001,2002,2003,2006],{},"注意 ",[13,2004,2005],{},"std::promise"," 不能随意复制，因此这里通过：",[42,2008,2010],{"className":44,"code":2009,"language":46,"meta":47,"style":47},"std::move(promise)\n",[13,2011,2012],{"__ignoreMap":47},[51,2013,2014,2016,2018,2020],{"class":53,"line":54},[51,2015,58],{"class":57},[51,2017,348],{"class":61},[51,2019,1953],{"class":57},[51,2021,2022],{"class":61},"(promise)\n",[10,2024,2025],{},"把 promise 的所有权移动到工作线程。",[109,2027,2029,2030],{"id":2028},"_11-promiseset_value","11. ",[13,2031,2032],{},"promise::set_value()",[42,2034,2036],{"className":44,"code":2035,"language":46,"meta":47,"style":47},"promise.set_value(value);\n",[13,2037,2038],{"__ignoreMap":47},[51,2039,2040,2042,2044],{"class":53,"line":54},[51,2041,1792],{"class":61},[51,2043,1870],{"class":57},[51,2045,2046],{"class":61},"(value);\n",[10,2048,2049],{},"向共享状态写入结果。",[10,2051,2052,2053,2056],{},"对于 ",[13,2054,2055],{},"std::promise\u003Cvoid>","：",[42,2058,2060],{"className":44,"code":2059,"language":46,"meta":47,"style":47},"promise.set_value();\n",[13,2061,2062],{"__ignoreMap":47},[51,2063,2064,2066,2068],{"class":53,"line":54},[51,2065,1792],{"class":61},[51,2067,1870],{"class":57},[51,2069,1081],{"class":61},[10,2071,2072],{},"表示任务成功完成，但没有具体返回值。",[109,2074,2076,2077],{"id":2075},"_12-promiseset_exception","12. ",[13,2078,2079],{},"promise::set_exception()",[10,2081,2082],{},"promise 也可以主动写入异常：",[42,2084,2086],{"className":44,"code":2085,"language":46,"meta":47,"style":47},"try\n{\n    ...\n}\ncatch (...)\n{\n    promise.set_exception(std::current_exception());\n}\n",[13,2087,2088,2093,2097,2102,2106,2114,2118,2137],{"__ignoreMap":47},[51,2089,2090],{"class":53,"line":54},[51,2091,2092],{"class":147},"try\n",[51,2094,2095],{"class":53,"line":65},[51,2096,284],{"class":61},[51,2098,2099],{"class":53,"line":73},[51,2100,2101],{"class":61},"    ...\n",[51,2103,2104],{"class":53,"line":81},[51,2105,305],{"class":61},[51,2107,2108,2111],{"class":53,"line":89},[51,2109,2110],{"class":147},"catch",[51,2112,2113],{"class":61}," (...)\n",[51,2115,2116],{"class":53,"line":287},[51,2117,284],{"class":61},[51,2119,2120,2122,2125,2127,2129,2131,2134],{"class":53,"line":302},[51,2121,1867],{"class":61},[51,2123,2124],{"class":57},"set_exception",[51,2126,262],{"class":61},[51,2128,58],{"class":57},[51,2130,348],{"class":61},[51,2132,2133],{"class":57},"current_exception",[51,2135,2136],{"class":61},"());\n",[51,2138,2139],{"class":53,"line":308},[51,2140,305],{"class":61},[10,2142,2143],{},"之后 future 调用：",[42,2145,2147],{"className":44,"code":2146,"language":46,"meta":47,"style":47},"future.get()\n",[13,2148,2149],{"__ignoreMap":47},[51,2150,2151,2153,2155],{"class":53,"line":54},[51,2152,697],{"class":61},[51,2154,187],{"class":57},[51,2156,190],{"class":61},[10,2158,2159],{},"会重新抛出这个异常。",[10,2161,2162],{},"完整示例：",[42,2164,2166],{"className":44,"code":2165,"language":46,"meta":47,"style":47},"#include \u003Cexception>\n#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cstdexcept>\n#include \u003Cthread>\n\nvoid producer(std::promise\u003Cint> promise)\n{\n    try\n    {\n        throw std::runtime_error(\"failed\");\n    }\n    catch (...)\n    {\n        promise.set_exception(std::current_exception());\n    }\n}\n\nint main()\n{\n    std::promise\u003Cint> promise;\n    auto future = promise.get_future();\n\n    std::thread t(producer, std::move(promise));\n\n    try\n    {\n        std::cout \u003C\u003C future.get() \u003C\u003C '\\n';\n    }\n    catch (const std::exception& e)\n    {\n        std::cout \u003C\u003C e.what() \u003C\u003C '\\n';\n    }\n\n    t.join();\n}\n",[13,2167,2168,2175,2181,2187,2193,2199,2203,2227,2231,2235,2239,2256,2260,2266,2270,2287,2291,2295,2299,2307,2311,2321,2335,2340,2359,2364,2369,2374,2399,2404,2421,2426,2451,2456,2461,2470],{"__ignoreMap":47},[51,2169,2170,2172],{"class":53,"line":54},[51,2171,235],{"class":147},[51,2173,2174],{"class":238}," \u003Cexception>\n",[51,2176,2177,2179],{"class":53,"line":65},[51,2178,235],{"class":147},[51,2180,239],{"class":238},[51,2182,2183,2185],{"class":53,"line":73},[51,2184,235],{"class":147},[51,2186,246],{"class":238},[51,2188,2189,2191],{"class":53,"line":81},[51,2190,235],{"class":147},[51,2192,1567],{"class":238},[51,2194,2195,2197],{"class":53,"line":89},[51,2196,235],{"class":147},[51,2198,738],{"class":238},[51,2200,2201],{"class":53,"line":287},[51,2202,252],{"emptyLinePlaceholder":251},[51,2204,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225],{"class":53,"line":302},[51,2206,1834],{"class":147},[51,2208,1837],{"class":57},[51,2210,262],{"class":61},[51,2212,58],{"class":57},[51,2214,348],{"class":61},[51,2216,1846],{"class":57},[51,2218,1849],{"class":61},[51,2220,154],{"class":147},[51,2222,1854],{"class":61},[51,2224,1846],{"class":267},[51,2226,279],{"class":61},[51,2228,2229],{"class":53,"line":308},[51,2230,284],{"class":61},[51,2232,2233],{"class":53,"line":313},[51,2234,1645],{"class":147},[51,2236,2237],{"class":53,"line":323},[51,2238,1473],{"class":61},[51,2240,2241,2243,2245,2247,2249,2251,2254],{"class":53,"line":328},[51,2242,1618],{"class":147},[51,2244,345],{"class":57},[51,2246,348],{"class":61},[51,2248,1625],{"class":57},[51,2250,262],{"class":61},[51,2252,2253],{"class":238},"\"failed\"",[51,2255,393],{"class":61},[51,2257,2258],{"class":53,"line":357},[51,2259,1495],{"class":61},[51,2261,2262,2264],{"class":53,"line":371},[51,2263,1682],{"class":147},[51,2265,2113],{"class":61},[51,2267,2268],{"class":53,"line":377},[51,2269,1473],{"class":61},[51,2271,2272,2275,2277,2279,2281,2283,2285],{"class":53,"line":387},[51,2273,2274],{"class":61},"        promise.",[51,2276,2124],{"class":57},[51,2278,262],{"class":61},[51,2280,58],{"class":57},[51,2282,348],{"class":61},[51,2284,2133],{"class":57},[51,2286,2136],{"class":61},[51,2288,2289],{"class":53,"line":396},[51,2290,1495],{"class":61},[51,2292,2293],{"class":53,"line":401},[51,2294,305],{"class":61},[51,2296,2297],{"class":53,"line":424},[51,2298,252],{"emptyLinePlaceholder":251},[51,2300,2301,2303,2305],{"class":53,"line":453},[51,2302,154],{"class":147},[51,2304,318],{"class":57},[51,2306,190],{"class":61},[51,2308,2309],{"class":53,"line":897},[51,2310,284],{"class":61},[51,2312,2313,2315,2317,2319],{"class":53,"line":902},[51,2314,331],{"class":57},[51,2316,1904],{"class":61},[51,2318,336],{"class":147},[51,2320,1909],{"class":61},[51,2322,2323,2325,2327,2329,2331,2333],{"class":53,"line":927},[51,2324,874],{"class":147},[51,2326,1920],{"class":61},[51,2328,342],{"class":147},[51,2330,1925],{"class":61},[51,2332,1795],{"class":57},[51,2334,1081],{"class":61},[51,2336,2338],{"class":53,"line":2337},23,[51,2339,252],{"emptyLinePlaceholder":251},[51,2341,2343,2345,2347,2349,2351,2353,2355,2357],{"class":53,"line":2342},24,[51,2344,331],{"class":57},[51,2346,1940],{"class":61},[51,2348,1943],{"class":57},[51,2350,1946],{"class":61},[51,2352,58],{"class":57},[51,2354,348],{"class":61},[51,2356,1953],{"class":57},[51,2358,1956],{"class":61},[51,2360,2362],{"class":53,"line":2361},25,[51,2363,252],{"emptyLinePlaceholder":251},[51,2365,2367],{"class":53,"line":2366},26,[51,2368,1645],{"class":147},[51,2370,2372],{"class":53,"line":2371},27,[51,2373,1473],{"class":61},[51,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397],{"class":53,"line":2376},28,[51,2378,360],{"class":57},[51,2380,406],{"class":61},[51,2382,409],{"class":147},[51,2384,1971],{"class":61},[51,2386,187],{"class":57},[51,2388,438],{"class":61},[51,2390,409],{"class":147},[51,2392,443],{"class":238},[51,2394,415],{"class":380},[51,2396,448],{"class":238},[51,2398,421],{"class":61},[51,2400,2402],{"class":53,"line":2401},29,[51,2403,1495],{"class":61},[51,2405,2407,2409,2411,2413,2415,2417,2419],{"class":53,"line":2406},30,[51,2408,1682],{"class":147},[51,2410,1685],{"class":61},[51,2412,1688],{"class":147},[51,2414,345],{"class":57},[51,2416,1693],{"class":61},[51,2418,1696],{"class":147},[51,2420,1699],{"class":61},[51,2422,2424],{"class":53,"line":2423},31,[51,2425,1473],{"class":61},[51,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449],{"class":53,"line":2428},32,[51,2430,360],{"class":57},[51,2432,406],{"class":61},[51,2434,409],{"class":147},[51,2436,1714],{"class":61},[51,2438,1717],{"class":57},[51,2440,438],{"class":61},[51,2442,409],{"class":147},[51,2444,443],{"class":238},[51,2446,415],{"class":380},[51,2448,448],{"class":238},[51,2450,421],{"class":61},[51,2452,2454],{"class":53,"line":2453},33,[51,2455,1495],{"class":61},[51,2457,2459],{"class":53,"line":2458},34,[51,2460,252],{"emptyLinePlaceholder":251},[51,2462,2464,2466,2468],{"class":53,"line":2463},35,[51,2465,1990],{"class":61},[51,2467,1993],{"class":57},[51,2469,1081],{"class":61},[51,2471,2473],{"class":53,"line":2472},36,[51,2474,305],{"class":61},[109,2476,2478],{"id":2477},"_13-什么是-broken-promise","13. 什么是 broken promise",[10,2480,2481,2482,2484],{},"如果 ",[13,2483,1846],{}," 在既没有：",[42,2486,2488],{"className":44,"code":2487,"language":46,"meta":47,"style":47},"set_value()\n",[13,2489,2490],{"__ignoreMap":47},[51,2491,2492,2494],{"class":53,"line":54},[51,2493,1870],{"class":57},[51,2495,190],{"class":61},[10,2497,2498],{},"也没有：",[42,2500,2502],{"className":44,"code":2501,"language":46,"meta":47,"style":47},"set_exception()\n",[13,2503,2504],{"__ignoreMap":47},[51,2505,2506,2508],{"class":53,"line":54},[51,2507,2124],{"class":57},[51,2509,190],{"class":61},[10,2511,2512],{},"的情况下被销毁，那么对应 future 不会永远傻等。",[10,2514,2515],{},"它会得到一个“broken promise”错误状态。",[10,2517,132],{},[42,2519,2521],{"className":44,"code":2520,"language":46,"meta":47,"style":47},"std::future\u003Cint> future;\n\n{\n    std::promise\u003Cint> promise;\n    future = promise.get_future();\n} \u002F\u002F promise 销毁，但没有写入结果\n\nfuture.get(); \u002F\u002F 抛出 std::future_error\n",[13,2522,2523,2534,2538,2542,2552,2565,2573,2577],{"__ignoreMap":47},[51,2524,2525,2527,2529,2531],{"class":53,"line":54},[51,2526,58],{"class":57},[51,2528,144],{"class":61},[51,2530,336],{"class":147},[51,2532,2533],{"class":61}," future;\n",[51,2535,2536],{"class":53,"line":65},[51,2537,252],{"emptyLinePlaceholder":251},[51,2539,2540],{"class":53,"line":73},[51,2541,284],{"class":61},[51,2543,2544,2546,2548,2550],{"class":53,"line":81},[51,2545,331],{"class":57},[51,2547,1904],{"class":61},[51,2549,336],{"class":147},[51,2551,1909],{"class":61},[51,2553,2554,2557,2559,2561,2563],{"class":53,"line":89},[51,2555,2556],{"class":61},"    future ",[51,2558,342],{"class":147},[51,2560,1925],{"class":61},[51,2562,1795],{"class":57},[51,2564,1081],{"class":61},[51,2566,2567,2570],{"class":53,"line":287},[51,2568,2569],{"class":61},"}",[51,2571,2572],{"class":1086}," \u002F\u002F promise 销毁，但没有写入结果\n",[51,2574,2575],{"class":53,"line":302},[51,2576,252],{"emptyLinePlaceholder":251},[51,2578,2579,2581,2583,2586],{"class":53,"line":308},[51,2580,697],{"class":61},[51,2582,187],{"class":57},[51,2584,2585],{"class":61},"();",[51,2587,2588],{"class":1086}," \u002F\u002F 抛出 std::future_error\n",[109,2590,2592,2593],{"id":2591},"_14-stdpackaged_task","14. ",[13,2594,2595],{},"std::packaged_task",[10,2597,2598,2600],{},[13,2599,2595],{}," 用来把一个可调用对象包装成：",[99,2602,2603],{},[10,2604,2605],{},"执行后自动把返回值或异常写进共享状态的任务。",[10,2607,132],{},[42,2609,2611],{"className":44,"code":2610,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    std::packaged_task\u003Cint(int, int)> task(add);\n    std::future\u003Cint> result = task.get_future();\n\n    task(10, 20);\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,2612,2613,2619,2625,2629,2650,2654,2664,2668,2672,2680,2684,2713,2732,2736,2753,2757,2781],{"__ignoreMap":47},[51,2614,2615,2617],{"class":53,"line":54},[51,2616,235],{"class":147},[51,2618,239],{"class":238},[51,2620,2621,2623],{"class":53,"line":65},[51,2622,235],{"class":147},[51,2624,246],{"class":238},[51,2626,2627],{"class":53,"line":73},[51,2628,252],{"emptyLinePlaceholder":251},[51,2630,2631,2633,2636,2638,2640,2642,2644,2646,2648],{"class":53,"line":81},[51,2632,154],{"class":147},[51,2634,2635],{"class":57}," add",[51,2637,262],{"class":61},[51,2639,154],{"class":147},[51,2641,268],{"class":267},[51,2643,271],{"class":61},[51,2645,154],{"class":147},[51,2647,276],{"class":267},[51,2649,279],{"class":61},[51,2651,2652],{"class":53,"line":89},[51,2653,284],{"class":61},[51,2655,2656,2658,2660,2662],{"class":53,"line":287},[51,2657,290],{"class":147},[51,2659,293],{"class":61},[51,2661,296],{"class":147},[51,2663,299],{"class":61},[51,2665,2666],{"class":53,"line":302},[51,2667,305],{"class":61},[51,2669,2670],{"class":53,"line":308},[51,2671,252],{"emptyLinePlaceholder":251},[51,2673,2674,2676,2678],{"class":53,"line":313},[51,2675,154],{"class":147},[51,2677,318],{"class":57},[51,2679,190],{"class":61},[51,2681,2682],{"class":53,"line":323},[51,2683,284],{"class":61},[51,2685,2686,2688,2691,2694,2696,2698,2700,2702,2705,2708,2710],{"class":53,"line":328},[51,2687,331],{"class":57},[51,2689,2690],{"class":61},"::packaged_task",[51,2692,2693],{"class":147},"\u003Cint",[51,2695,262],{"class":61},[51,2697,154],{"class":147},[51,2699,271],{"class":61},[51,2701,154],{"class":147},[51,2703,2704],{"class":61},")",[51,2706,2707],{"class":147},">",[51,2709,749],{"class":57},[51,2711,2712],{"class":61},"(add);\n",[51,2714,2715,2717,2719,2721,2723,2725,2728,2730],{"class":53,"line":357},[51,2716,331],{"class":57},[51,2718,144],{"class":61},[51,2720,336],{"class":147},[51,2722,339],{"class":61},[51,2724,342],{"class":147},[51,2726,2727],{"class":61}," task.",[51,2729,1795],{"class":57},[51,2731,1081],{"class":61},[51,2733,2734],{"class":53,"line":371},[51,2735,252],{"emptyLinePlaceholder":251},[51,2737,2738,2741,2743,2746,2748,2751],{"class":53,"line":377},[51,2739,2740],{"class":57},"    task",[51,2742,262],{"class":61},[51,2744,2745],{"class":380},"10",[51,2747,271],{"class":61},[51,2749,2750],{"class":380},"20",[51,2752,393],{"class":61},[51,2754,2755],{"class":53,"line":387},[51,2756,252],{"emptyLinePlaceholder":251},[51,2758,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779],{"class":53,"line":396},[51,2760,331],{"class":57},[51,2762,406],{"class":61},[51,2764,409],{"class":147},[51,2766,433],{"class":61},[51,2768,187],{"class":57},[51,2770,438],{"class":61},[51,2772,409],{"class":147},[51,2774,443],{"class":238},[51,2776,415],{"class":380},[51,2778,448],{"class":238},[51,2780,421],{"class":61},[51,2782,2783],{"class":53,"line":401},[51,2784,305],{"class":61},[10,2786,458],{},[42,2788,2790],{"className":44,"code":2789,"language":46,"meta":47,"style":47},"std::packaged_task\u003Cint(int, int)>\n",[13,2791,2792],{"__ignoreMap":47},[51,2793,2794,2796,2798,2800,2802,2804,2806,2808,2810],{"class":53,"line":54},[51,2795,58],{"class":57},[51,2797,2690],{"class":61},[51,2799,2693],{"class":147},[51,2801,262],{"class":61},[51,2803,154],{"class":147},[51,2805,271],{"class":61},[51,2807,154],{"class":147},[51,2809,2704],{"class":61},[51,2811,2812],{"class":147},">\n",[10,2814,2815],{},"Indicates:",[42,2817,2820],{"className":2818,"code":2819,"language":127,"meta":47},[125],"接收两个 int\n返回一个 int\n",[13,2821,2819],{"__ignoreMap":47},[109,2823,2825,2826,2829],{"id":2824},"_15-packaged_task-和-thread-配合","15. ",[13,2827,2828],{},"packaged_task"," 和 thread 配合",[42,2831,2833],{"className":44,"code":2832,"language":46,"meta":47,"style":47},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nint calculate()\n{\n    return 42;\n}\n\nint main()\n{\n    std::packaged_task\u003Cint()> task(calculate);\n    std::future\u003Cint> result = task.get_future();\n\n    std::thread t(std::move(task));\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n    t.join();\n}\n",[13,2834,2835,2841,2847,2853,2857,2865,2869,2877,2881,2885,2893,2897,2915,2933,2937,2956,2960,2984,2992],{"__ignoreMap":47},[51,2836,2837,2839],{"class":53,"line":54},[51,2838,235],{"class":147},[51,2840,239],{"class":238},[51,2842,2843,2845],{"class":53,"line":65},[51,2844,235],{"class":147},[51,2846,246],{"class":238},[51,2848,2849,2851],{"class":53,"line":73},[51,2850,235],{"class":147},[51,2852,738],{"class":238},[51,2854,2855],{"class":53,"line":81},[51,2856,252],{"emptyLinePlaceholder":251},[51,2858,2859,2861,2863],{"class":53,"line":89},[51,2860,154],{"class":147},[51,2862,259],{"class":57},[51,2864,190],{"class":61},[51,2866,2867],{"class":53,"line":287},[51,2868,284],{"class":61},[51,2870,2871,2873,2875],{"class":53,"line":302},[51,2872,290],{"class":147},[51,2874,804],{"class":380},[51,2876,421],{"class":61},[51,2878,2879],{"class":53,"line":308},[51,2880,305],{"class":61},[51,2882,2883],{"class":53,"line":313},[51,2884,252],{"emptyLinePlaceholder":251},[51,2886,2887,2889,2891],{"class":53,"line":323},[51,2888,154],{"class":147},[51,2890,318],{"class":57},[51,2892,190],{"class":61},[51,2894,2895],{"class":53,"line":328},[51,2896,284],{"class":61},[51,2898,2899,2901,2903,2905,2908,2910,2912],{"class":53,"line":357},[51,2900,331],{"class":57},[51,2902,2690],{"class":61},[51,2904,2693],{"class":147},[51,2906,2907],{"class":61},"()",[51,2909,2707],{"class":147},[51,2911,749],{"class":57},[51,2913,2914],{"class":61},"(calculate);\n",[51,2916,2917,2919,2921,2923,2925,2927,2929,2931],{"class":53,"line":371},[51,2918,331],{"class":57},[51,2920,144],{"class":61},[51,2922,336],{"class":147},[51,2924,339],{"class":61},[51,2926,342],{"class":147},[51,2928,2727],{"class":61},[51,2930,1795],{"class":57},[51,2932,1081],{"class":61},[51,2934,2935],{"class":53,"line":377},[51,2936,252],{"emptyLinePlaceholder":251},[51,2938,2939,2941,2943,2945,2947,2949,2951,2953],{"class":53,"line":387},[51,2940,331],{"class":57},[51,2942,1940],{"class":61},[51,2944,1943],{"class":57},[51,2946,262],{"class":61},[51,2948,58],{"class":57},[51,2950,348],{"class":61},[51,2952,1953],{"class":57},[51,2954,2955],{"class":61},"(task));\n",[51,2957,2958],{"class":53,"line":396},[51,2959,252],{"emptyLinePlaceholder":251},[51,2961,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980,2982],{"class":53,"line":401},[51,2963,331],{"class":57},[51,2965,406],{"class":61},[51,2967,409],{"class":147},[51,2969,433],{"class":61},[51,2971,187],{"class":57},[51,2973,438],{"class":61},[51,2975,409],{"class":147},[51,2977,443],{"class":238},[51,2979,415],{"class":380},[51,2981,448],{"class":238},[51,2983,421],{"class":61},[51,2985,2986,2988,2990],{"class":53,"line":424},[51,2987,1990],{"class":61},[51,2989,1993],{"class":57},[51,2991,1081],{"class":61},[51,2993,2994],{"class":53,"line":453},[51,2995,305],{"class":61},[10,2997,2998,3000],{},[13,2999,2828],{}," 本身是 move-only 的，因此传入线程时需要：",[42,3002,3004],{"className":44,"code":3003,"language":46,"meta":47,"style":47},"std::move(task)\n",[13,3005,3006],{"__ignoreMap":47},[51,3007,3008,3010,3012,3014],{"class":53,"line":54},[51,3009,58],{"class":57},[51,3011,348],{"class":61},[51,3013,1953],{"class":57},[51,3015,3016],{"class":61},"(task)\n",[10,3018,3019],{},"线程池内部经常会出现类似思想：",[42,3021,3024],{"className":3022,"code":3023,"language":127,"meta":47},[125],"把任务包装起来\n      ↓\n放入任务队列\n      ↓\nworker thread 取出并执行\n      ↓\nfuture 接收结果\n",[13,3025,3023],{"__ignoreMap":47},[109,3027,3029,3030,601,3032,3034],{"id":3028},"_16-promise-和-packaged_task-的区别","16. ",[13,3031,1846],{},[13,3033,2828],{}," 的区别",[10,3036,3037,3039],{},[13,3038,1846],{}," 更像：",[99,3041,3042],{},[10,3043,3044],{},"我自己决定什么时候、在什么逻辑里把结果写进去。",[10,3046,3047,3048,3039],{},"而 ",[13,3049,2828],{},[99,3051,3052],{},[10,3053,3054],{},"我已经有一个可调用对象，执行它时自动把返回值写进 future。",[10,3056,132],{},[42,3058,3061],{"className":3059,"code":3060,"language":127,"meta":47},[125],"promise\n适合手动生产结果\n\npackaged_task\n适合包装已有函数\u002F任务\n",[13,3062,3060],{"__ignoreMap":47},[109,3064,3066,3067],{"id":3065},"_17-stdshared_future","17. ",[13,3068,3069],{},"std::shared_future",[10,3071,1011,3072,3074],{},[13,3073,1014],{}," 更偏单消费者：",[42,3076,3077],{"className":44,"code":2146,"language":46,"meta":47,"style":47},[13,3078,3079],{"__ignoreMap":47},[51,3080,3081,3083,3085],{"class":53,"line":54},[51,3082,697],{"class":61},[51,3084,187],{"class":57},[51,3086,190],{"class":61},[10,3088,3089],{},"通常只能消费一次。",[10,3091,3092],{},"如果多个地方都需要读取同一个异步结果，可以使用：",[42,3094,3096],{"className":44,"code":3095,"language":46,"meta":47,"style":47},"std::shared_future\u003CT>\n",[13,3097,3098],{"__ignoreMap":47},[51,3099,3100,3102,3105,3107,3110],{"class":53,"line":54},[51,3101,58],{"class":57},[51,3103,3104],{"class":61},"::shared_future",[51,3106,1849],{"class":147},[51,3108,3109],{"class":61},"T",[51,3111,2812],{"class":147},[10,3113,3114],{},"可以由普通 future 转换：",[42,3116,3118],{"className":44,"code":3117,"language":46,"meta":47,"style":47},"auto future = std::async(std::launch::async, [] {\n    return 42;\n});\n\nstd::shared_future\u003Cint> shared = future.share();\n",[13,3119,3120,3144,3152,3156,3160],{"__ignoreMap":47},[51,3121,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142],{"class":53,"line":54},[51,3123,957],{"class":147},[51,3125,1920],{"class":61},[51,3127,342],{"class":147},[51,3129,345],{"class":57},[51,3131,348],{"class":61},[51,3133,351],{"class":57},[51,3135,262],{"class":61},[51,3137,58],{"class":57},[51,3139,348],{"class":61},[51,3141,365],{"class":57},[51,3143,1048],{"class":61},[51,3145,3146,3148,3150],{"class":53,"line":65},[51,3147,290],{"class":147},[51,3149,804],{"class":380},[51,3151,421],{"class":61},[51,3153,3154],{"class":53,"line":73},[51,3155,1061],{"class":61},[51,3157,3158],{"class":53,"line":81},[51,3159,252],{"emptyLinePlaceholder":251},[51,3161,3162,3164,3166,3168,3171,3173,3175,3178],{"class":53,"line":89},[51,3163,58],{"class":57},[51,3165,3104],{"class":61},[51,3167,336],{"class":147},[51,3169,3170],{"class":61}," shared ",[51,3172,342],{"class":147},[51,3174,1971],{"class":61},[51,3176,3177],{"class":57},"share",[51,3179,1081],{"class":61},[10,3181,3182],{},"之后多个线程可以：",[42,3184,3186],{"className":44,"code":3185,"language":46,"meta":47,"style":47},"shared.get()\n",[13,3187,3188],{"__ignoreMap":47},[51,3189,3190,3193,3195],{"class":53,"line":54},[51,3191,3192],{"class":61},"shared.",[51,3194,187],{"class":57},[51,3196,190],{"class":61},[10,3198,3199],{},"读取同一个结果。",[109,3201,3203,3204,601,3206,3208],{"id":3202},"_18-async-和-thread-怎么选","18. ",[13,3205,351],{},[13,3207,528],{}," 怎么选",[10,3210,3211],{},"如果你关心的是：",[42,3213,3216],{"className":3214,"code":3215,"language":127,"meta":47},[125],"启动一个长期运行线程\n控制线程生命周期\n线程循环\n明确 join\u002Fdetach\n",[13,3217,3215],{"__ignoreMap":47},[10,3219,3220],{},"使用：",[42,3222,3224],{"className":44,"code":3223,"language":46,"meta":47,"style":47},"std::thread \u002F std::jthread\n",[13,3225,3226],{"__ignoreMap":47},[51,3227,3228,3230,3232,3235,3237],{"class":53,"line":54},[51,3229,58],{"class":57},[51,3231,1940],{"class":61},[51,3233,3234],{"class":147},"\u002F",[51,3236,345],{"class":57},[51,3238,3239],{"class":61},"::jthread\n",[10,3241,3211],{},[42,3243,3246],{"className":3244,"code":3245,"language":127,"meta":47},[125],"提交一个任务\n未来得到返回值\n自动传播异常\n",[13,3247,3245],{"__ignoreMap":47},[10,3249,3250],{},"可以优先考虑：",[42,3252,3254],{"className":44,"code":3253,"language":46,"meta":47,"style":47},"std::async \u002F std::future\n",[13,3255,3256],{"__ignoreMap":47},[51,3257,3258,3260,3263,3265,3267],{"class":53,"line":54},[51,3259,58],{"class":57},[51,3261,3262],{"class":61},"::async ",[51,3264,3234],{"class":147},[51,3266,345],{"class":57},[51,3268,62],{"class":61},[10,3270,3271],{},"它们表达的是不同层次的抽象。",[109,3273,3275],{"id":3274},"_19-常见错误","19. 常见错误",[3277,3278,3279],"ol",{},[21,3280,3281,3282,3284],{},"不写 launch policy，却默认认为 ",[13,3283,225],{}," 一定创建新线程。",[3277,3286,3287],{"start":65},[21,3288,3289,3290,3292,3293,155],{},"对同一个普通 ",[13,3291,106],{}," 重复调用 ",[13,3294,939],{},[3277,3296,3297],{"start":73},[21,3298,3299,3300,3302],{},"忘记处理异步任务在 ",[13,3301,939],{}," 时重新抛出的异常。",[3277,3304,3305],{"start":81},[21,3306,3307,3309,3310,3313,3314,3317],{},[13,3308,1846],{}," 销毁前既不 ",[13,3311,3312],{},"set_value()"," 也不 ",[13,3315,3316],{},"set_exception()","，产生 broken promise。",[3277,3319,3320],{"start":89},[21,3321,3322,3323,3325,3326,3328],{},"把 move-only 的 ",[13,3324,1846],{}," \u002F ",[13,3327,2828],{}," 当成可复制对象使用。",[3277,3330,3331],{"start":287},[21,3332,3333,3334,155],{},"为一个长期运行、需要明确停止控制的后台线程强行使用 ",[13,3335,225],{},[109,3337,3339],{"id":3338},"summary","Summary",[18,3341,3342],{},[21,3343,3344,3346,3347,3349],{},[13,3345,115],{}," 表示未来产生的 ",[13,3348,3109],{}," 结果。",[18,3351,3352],{},[21,3353,3354,3356],{},[13,3355,225],{}," 适合直接提交一个会返回结果的任务。",[18,3358,3359],{},[21,3360,3361,3362,155],{},"明确要求真正异步执行时，使用 ",[13,3363,600],{},[18,3365,3366],{},[21,3367,3368,3370],{},[13,3369,1007],{}," 会等待结果并取得值，也会重新抛出异步任务中的异常。",[18,3372,3373],{},[21,3374,3375,3377],{},[13,3376,2005],{}," 是结果通道的主动写入端。",[18,3379,3380],{},[21,3381,3382,3384],{},[13,3383,2595],{}," 把可调用对象包装成能产生 future 的任务。",[18,3386,3387],{},[21,3388,3389,3391],{},[13,3390,3069],{}," 允许多个消费者读取同一个结果。",[18,3393,3394],{},[21,3395,3396,3398,3399,3402],{},[13,3397,528],{}," 偏线程生命周期管理，",[13,3400,3401],{},"future\u002Fasync"," 偏任务与结果管理。",[3404,3405,3406],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":47,"searchDepth":65,"depth":65,"links":3408},[3409,3411,3413,3415,3422,3423,3425,3427,3429,3430,3432,3434,3436,3437,3439,3441,3443,3445,3447,3448],{"id":111,"depth":65,"text":3410},"1. std::future\u003CT> 是什么",{"id":221,"depth":65,"text":3412},"2. 最简单的 std::async",{"id":521,"depth":65,"text":3414},"3. async 的参数和 thread 很像",{"id":596,"depth":65,"text":3416,"children":3417},"4. std::launch::async 和 std::launch::deferred",[3418,3420],{"id":613,"depth":73,"text":3419},"4.1 std::launch::async",{"id":654,"depth":73,"text":3421},"4.2 std::launch::deferred",{"id":943,"depth":65,"text":944},{"id":1003,"depth":65,"text":3424},"6. future::get() 只能取得一次",{"id":1118,"depth":65,"text":3426},"7. wait()：只等待，不取结果",{"id":1214,"depth":65,"text":3428},"8. wait_for()：等待一段时间",{"id":1530,"depth":65,"text":1531},{"id":1761,"depth":65,"text":3431},"10. std::promise\u003CT>",{"id":2028,"depth":65,"text":3433},"11. promise::set_value()",{"id":2075,"depth":65,"text":3435},"12. promise::set_exception()",{"id":2477,"depth":65,"text":2478},{"id":2591,"depth":65,"text":3438},"14. std::packaged_task",{"id":2824,"depth":65,"text":3440},"15. packaged_task 和 thread 配合",{"id":3028,"depth":65,"text":3442},"16. promise 和 packaged_task 的区别",{"id":3065,"depth":65,"text":3444},"17. std::shared_future",{"id":3202,"depth":65,"text":3446},"18. async 和 thread 怎么选",{"id":3274,"depth":65,"text":3275},{"id":3338,"depth":65,"text":3339},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","2000-1900-0500","2023-10-05","std::thread 很适合表达“启动一个线程”，但它本身不直接提供：","wiki\u002F2023-10-05-cplusplus-jiao-xue","en-us:2023-10-05-cplusplus-jiao-xue","\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise",false,null,"en-US","en-us",{},{"title":5,"description":3452},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise","B5PR-9xBlQrwoNYuyUPS-I62Lxl9O0EEHuMcA1qyq9Y",[3469,3475,3480,3485,3490,3495,3500,3505,3510,3515,3520,3525,3530,3535,3540,3545,3550,3555,3560,3565,3570,3575,3580,3585,3590,3595,3600,3605,3610,3615,3620,3625,3630,3635,3640,3645,3650,3655,3660,3665,3669,3674,3678,3683,3688,3693,3698,3703,3708,3713,3718,3723,3728,3733,3738,3743,3748,3753,3757,3762,3767,3772,3773,3778,3783,3788,3793,3798,3803,3808,3813,3818,3823,3828,3833,3838,3843,3848,3853,3858,3863,3868,3873,3878,3883,3888,3893],{"path":3470,"stem":3471,"title":3472,"date":3451,"chapterOrder":3473,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++ Development Environment Setup and Testing","0100",0,{"path":3476,"stem":3477,"title":3478,"date":3451,"chapterOrder":3479,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++ Basics","0200",{"path":3481,"stem":3482,"title":3483,"date":3451,"chapterOrder":3484,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","Data Types and Data Storage","0300",{"path":3486,"stem":3487,"title":3488,"date":3451,"chapterOrder":3489,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","Input and Output","0400",{"path":3491,"stem":3492,"title":3493,"date":3451,"chapterOrder":3494,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","operator","0500",{"path":3496,"stem":3497,"title":3498,"date":3451,"chapterOrder":3499,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","program flow structure","0600",{"path":3501,"stem":3502,"title":3503,"date":3451,"chapterOrder":3504,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":3506,"stem":3507,"title":3508,"date":3451,"chapterOrder":3509,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","Functions and Header Files","0800",{"path":3511,"stem":3512,"title":3513,"date":3451,"chapterOrder":3514,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":3516,"stem":3517,"title":3518,"date":3451,"chapterOrder":3519,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","Structures and Unions","1000",{"path":3521,"stem":3522,"title":3523,"date":3451,"chapterOrder":3524,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","Memory Partitioning and Lifecycle","1100",{"path":3526,"stem":3527,"title":3528,"date":3451,"chapterOrder":3529,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":3531,"stem":3532,"title":3533,"date":3451,"chapterOrder":3534,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","Function Optimization","1300",{"path":3536,"stem":3537,"title":3538,"date":3451,"chapterOrder":3539,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间","1350",{"path":3541,"stem":3542,"title":3543,"date":3451,"chapterOrder":3544,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","encapsulation","1400-0100",{"path":3546,"stem":3547,"title":3548,"date":3451,"chapterOrder":3549,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","Object initialization and cleanup","1400-0200",{"path":3551,"stem":3552,"title":3553,"date":3451,"chapterOrder":3554,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","Object Model and the `this` Pointer","1400-0300",{"path":3556,"stem":3557,"title":3558,"date":3451,"chapterOrder":3559,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","Friends and operator overloading","1400-0400",{"path":3561,"stem":3562,"title":3563,"date":3451,"chapterOrder":3564,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","inheritance","1400-0500",{"path":3566,"stem":3567,"title":3568,"date":3451,"chapterOrder":3569,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","polymorphism","1400-0600",{"path":3571,"stem":3572,"title":3573,"date":3451,"chapterOrder":3574,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","Classes and Objects","1400",{"path":3576,"stem":3577,"title":3578,"date":3451,"chapterOrder":3579,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","function pointer","1450",{"path":3581,"stem":3582,"title":3583,"date":3451,"chapterOrder":3584,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","File operations","1500",{"path":3586,"stem":3587,"title":3588,"date":3451,"chapterOrder":3589,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":3591,"stem":3592,"title":3593,"date":3451,"chapterOrder":3594,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":3596,"stem":3597,"title":3598,"date":3451,"chapterOrder":3599,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","Introduction to STL","1800-0100",{"path":3601,"stem":3602,"title":3603,"date":3451,"chapterOrder":3604,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":3606,"stem":3607,"title":3608,"date":3451,"chapterOrder":3609,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string container","1800-0300",{"path":3611,"stem":3612,"title":3613,"date":3451,"chapterOrder":3614,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":3616,"stem":3617,"title":3618,"date":3451,"chapterOrder":3619,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":3621,"stem":3622,"title":3623,"date":3451,"chapterOrder":3624,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":3626,"stem":3627,"title":3628,"date":3451,"chapterOrder":3629,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue container","1800-0700",{"path":3631,"stem":3632,"title":3633,"date":3451,"chapterOrder":3634,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":3636,"stem":3637,"title":3638,"date":3451,"chapterOrder":3639,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":3641,"stem":3642,"title":3643,"date":3451,"chapterOrder":3644,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":3646,"stem":3647,"title":3648,"date":3451,"chapterOrder":3649,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","Function objects and predicates","1800-1100",{"path":3651,"stem":3652,"title":3653,"date":3451,"chapterOrder":3654,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","Common algorithms","1800-1200",{"path":3656,"stem":3657,"title":3658,"date":3451,"chapterOrder":3659,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","Level up your programming with STL.","1800",{"path":3661,"stem":3662,"title":3663,"date":3451,"chapterOrder":3664,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":3666,"stem":3667,"title":957,"date":3451,"chapterOrder":3668,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":3670,"stem":3671,"title":3672,"date":3451,"chapterOrder":3673,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":3675,"stem":3676,"title":1343,"date":3451,"chapterOrder":3677,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":3679,"stem":3680,"title":3681,"date":3451,"chapterOrder":3682,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":3684,"stem":3685,"title":3686,"date":3451,"chapterOrder":3687,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","range-based for loop","2000-0500",{"path":3689,"stem":3690,"title":3691,"date":3451,"chapterOrder":3692,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","structured binding","2000-0600",{"path":3694,"stem":3695,"title":3696,"date":3451,"chapterOrder":3697,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":3699,"stem":3700,"title":3701,"date":3451,"chapterOrder":3702,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":3704,"stem":3705,"title":3706,"date":3451,"chapterOrder":3707,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","Smart pointer","2000-0900",{"path":3709,"stem":3710,"title":3711,"date":3451,"chapterOrder":3712,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","Rvalue references and move semantics","2000-1000",{"path":3714,"stem":3715,"title":3716,"date":3451,"chapterOrder":3717,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda expression","2000-1100",{"path":3719,"stem":3720,"title":3721,"date":3451,"chapterOrder":3722,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":3724,"stem":3725,"title":3726,"date":3451,"chapterOrder":3727,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":3729,"stem":3730,"title":3731,"date":3451,"chapterOrder":3732,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":3734,"stem":3735,"title":3736,"date":3451,"chapterOrder":3737,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":3739,"stem":3740,"title":3741,"date":3451,"chapterOrder":3742,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":3744,"stem":3745,"title":3746,"date":3451,"chapterOrder":3747,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":3749,"stem":3750,"title":3751,"date":3451,"chapterOrder":3752,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":3754,"stem":3755,"title":15,"date":3451,"chapterOrder":3756,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","2000-1900-0100",{"path":3758,"stem":3759,"title":3760,"date":3451,"chapterOrder":3761,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 RAII 锁","2000-1900-0200",{"path":3763,"stem":3764,"title":3765,"date":3451,"chapterOrder":3766,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":3768,"stem":3769,"title":3770,"date":3451,"chapterOrder":3771,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":3449,"stem":3466,"title":5,"date":3451,"chapterOrder":3450,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},{"path":3774,"stem":3775,"title":3776,"date":3451,"chapterOrder":3777,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0600-jthread-stop-token","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0600-jthread-stop-token","jthread 与 stop_token","2000-1900-0600",{"path":3779,"stem":3780,"title":3781,"date":3451,"chapterOrder":3782,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier","semaphore、latch 与 barrier","2000-1900-0700",{"path":3784,"stem":3785,"title":3786,"date":3451,"chapterOrder":3787,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","Concurrent programming","2000-1900",{"path":3789,"stem":3790,"title":3791,"date":3451,"chapterOrder":3792,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":3794,"stem":3795,"title":3796,"date":3451,"chapterOrder":3797,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","Modules Introduction","2000-2100",{"path":3799,"stem":3800,"title":3801,"date":3451,"chapterOrder":3802,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","Modern C++","2000",{"path":3804,"stem":3805,"title":3806,"date":3451,"chapterOrder":3807,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","Timers and Asynchronous I\u002FO","2100-0100-0100",{"path":3809,"stem":3810,"title":3811,"date":3451,"chapterOrder":3812,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio Basics","2100-0100-0200",{"path":3814,"stem":3815,"title":3816,"date":3451,"chapterOrder":3817,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","serial communication","2100-0100-0300",{"path":3819,"stem":3820,"title":3821,"date":3451,"chapterOrder":3822,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP communication","2100-0100-0400",{"path":3824,"stem":3825,"title":3826,"date":3451,"chapterOrder":3827,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP communication","2100-0100-0500",{"path":3829,"stem":3830,"title":3831,"date":3451,"chapterOrder":3832,"chapterDepth":65,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","Robot Engineering Approach and ROS2 Integration","2100-0100-0600",{"path":3834,"stem":3835,"title":3836,"date":3451,"chapterOrder":3837,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio asynchronous IO library","2100-0100",{"path":3839,"stem":3840,"title":3841,"date":3451,"chapterOrder":3842,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen linear algebra library","2100-0200",{"path":3844,"stem":3845,"title":3846,"date":3451,"chapterOrder":3847,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV Computer Vision Library","2100-0300",{"path":3849,"stem":3850,"title":3851,"date":3451,"chapterOrder":3852,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL Point Cloud Library","2100-0400",{"path":3854,"stem":3855,"title":3856,"date":3451,"chapterOrder":3857,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus Lie group and Lie algebra library","2100-0500",{"path":3859,"stem":3860,"title":3861,"date":3451,"chapterOrder":3862,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","Learning Common Libraries","2100",{"path":3864,"stem":3865,"title":3866,"date":3451,"chapterOrder":3867,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets and Build Installation","2200-0100",{"path":3869,"stem":3870,"title":3871,"date":3451,"chapterOrder":3872,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","Top-level CMake and Public Compilation Options","2200-0200",{"path":3874,"stem":3875,"title":3876,"date":3451,"chapterOrder":3877,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","Detailed CMake Explanation for src and lib Modules","2200-0300",{"path":3879,"stem":3880,"title":3881,"date":3451,"chapterOrder":3882,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","How to write third-party library dependencies","2200-0400",{"path":3884,"stem":3885,"title":3886,"date":3451,"chapterOrder":3887,"chapterDepth":54,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","Template Extensions and FAQ","2200-0500",{"path":3889,"stem":3890,"title":3891,"date":3451,"chapterOrder":3892,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":3459},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake Project Template","2200",{"path":3455,"stem":3894,"title":3895,"date":3451,"chapterOrder":3460,"chapterDepth":3474,"docKey":3454,"docRoot":3455,"docTitle":3456,"isWikiDoc":251,"isWikiIndex":251},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":3897},[3898,3899,3902,3905,3908],{"path":3449,"localeSlug":3462,"i18nKey":3458},{"path":3900,"localeSlug":3901,"i18nKey":3458},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-hant",{"path":3903,"localeSlug":3904,"i18nKey":3458},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-hk",{"path":3906,"localeSlug":3907,"i18nKey":3458},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-tw",{"path":3909,"localeSlug":3910,"i18nKey":3458},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-cn",[3449,3465,3900,3465,3903,3465,3906,3465,3909,3465],1789198804154]