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