[{"data":1,"prerenderedAt":1714},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":1328},{"id":4,"title":5,"body":6,"chapterDepth":77,"chapterOrder":1316,"date":1317,"description":59,"docKey":1318,"docRoot":1319,"docTitle":1320,"extension":1321,"isWikiDoc":104,"isWikiIndex":1322,"meta":1323,"navigation":104,"path":1324,"seo":1325,"stem":1326,"wikiDepth":66,"__hash__":1327},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread.md","std::thread 与 join",{"type":7,"value":8,"toc":1307},"minimark",[9,13,21,38,41,46,53,608,615,623,640,644,647,657,1083,1087,1093,1096,1099,1104,1155,1165,1170,1259,1271,1274,1303],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16,20],"p",{},[17,18,19],"code",{},"std::thread"," 用来创建线程。线程创建后会立刻启动，主线程可以继续执行自己的代码。",[14,22,23,24,26,27,30,31,34,35,37],{},"初学阶段最重要的是记住：",[17,25,19],{}," 对象销毁前，必须调用 ",[17,28,29],{},"join()"," 或 ",[17,32,33],{},"detach()","。多数教学和普通业务代码里优先用 ",[17,36,29],{},"，因为它会等待线程结束，生命周期最清楚。",[10,39,40],{"id":40},"示例代码",[42,43,45],"h3",{"id":44},"示例-1创建两个线程分别处理两份数据","示例 1：创建两个线程分别处理两份数据",[14,47,48,49,52],{},"这个例子中，两个线程分别写入不同的 ",[17,50,51],{},"vector","，所以没有共享写同一个容器，不需要加锁。主线程等两个线程都结束后再打印结果。",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cthread>\n#include \u003Cvector>\n\n\u002F\u002F vector 是动态数组，元素数量可以在运行时变化。\nvoid fill_numbers(std::vector\u003Cint>& output, int start)\n{\n    for (int i = 0; i \u003C 3; ++i)\n    {\n        output.push_back(start + i);\n    }\n}\n\nvoid print_numbers(const char* name, const std::vector\u003Cint>& values)\n{\n    std::cout \u003C\u003C name \u003C\u003C \": \";\n    for (int value : values)\n    {\n        std::cout \u003C\u003C value \u003C\u003C \" \";\n    }\n    std::cout \u003C\u003C \"\\n\";\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    std::vector\u003Cint> left;\n    std::vector\u003Cint> right;\n\n    \u002F\u002F 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread t1(fill_numbers, std::ref(left), 1);\n    std::thread t2(fill_numbers, std::ref(right), 10);\n\n    \u002F\u002F join 会等待子线程结束，避免 main 提前退出。\n    t1.join();\n    t2.join();\n\n    print_numbers(\"left\", left);\n    print_numbers(\"right\", right);\n    std::cout \u003C\u003C \"done\\n\";\n\n    return 0;\n}\n","cpp","",[17,61,62,75,83,91,99,106,113,162,168,206,212,230,236,242,247,290,295,318,330,335,355,360,380,385,390,401,406,412,426,438,443,449,479,505,510,516,528,538,543,557,570,588,593,603],{"__ignoreMap":59},[63,64,67,71],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"szBVR","#include",[63,72,74],{"class":73},"sZZnC"," \u003Cfunctional>\n",[63,76,78,80],{"class":65,"line":77},2,[63,79,70],{"class":69},[63,81,82],{"class":73}," \u003Ciostream>\n",[63,84,86,88],{"class":65,"line":85},3,[63,87,70],{"class":69},[63,89,90],{"class":73}," \u003Cthread>\n",[63,92,94,96],{"class":65,"line":93},4,[63,95,70],{"class":69},[63,97,98],{"class":73}," \u003Cvector>\n",[63,100,102],{"class":65,"line":101},5,[63,103,105],{"emptyLinePlaceholder":104},true,"\n",[63,107,109],{"class":65,"line":108},6,[63,110,112],{"class":111},"sJ8bj","\u002F\u002F vector 是动态数组，元素数量可以在运行时变化。\n",[63,114,116,119,123,127,130,133,135,138,141,144,147,151,154,156,159],{"class":65,"line":115},7,[63,117,118],{"class":69},"void",[63,120,122],{"class":121},"sScJk"," fill_numbers",[63,124,126],{"class":125},"sVt8B","(",[63,128,129],{"class":121},"std",[63,131,132],{"class":125},"::",[63,134,51],{"class":121},[63,136,137],{"class":125},"\u003C",[63,139,140],{"class":69},"int",[63,142,143],{"class":125},">",[63,145,146],{"class":69},"&",[63,148,150],{"class":149},"s4XuR"," output",[63,152,153],{"class":125},", ",[63,155,140],{"class":69},[63,157,158],{"class":149}," start",[63,160,161],{"class":125},")\n",[63,163,165],{"class":65,"line":164},8,[63,166,167],{"class":125},"{\n",[63,169,171,174,177,179,182,185,189,192,194,197,200,203],{"class":65,"line":170},9,[63,172,173],{"class":69},"    for",[63,175,176],{"class":125}," (",[63,178,140],{"class":69},[63,180,181],{"class":125}," i ",[63,183,184],{"class":69},"=",[63,186,188],{"class":187},"sj4cs"," 0",[63,190,191],{"class":125},"; i ",[63,193,137],{"class":69},[63,195,196],{"class":187}," 3",[63,198,199],{"class":125},"; ",[63,201,202],{"class":69},"++",[63,204,205],{"class":125},"i)\n",[63,207,209],{"class":65,"line":208},10,[63,210,211],{"class":125},"    {\n",[63,213,215,218,221,224,227],{"class":65,"line":214},11,[63,216,217],{"class":125},"        output.",[63,219,220],{"class":121},"push_back",[63,222,223],{"class":125},"(start ",[63,225,226],{"class":69},"+",[63,228,229],{"class":125}," i);\n",[63,231,233],{"class":65,"line":232},12,[63,234,235],{"class":125},"    }\n",[63,237,239],{"class":65,"line":238},13,[63,240,241],{"class":125},"}\n",[63,243,245],{"class":65,"line":244},14,[63,246,105],{"emptyLinePlaceholder":104},[63,248,250,252,255,257,260,263,266,268,270,273,275,277,279,281,283,285,288],{"class":65,"line":249},15,[63,251,118],{"class":69},[63,253,254],{"class":121}," print_numbers",[63,256,126],{"class":125},[63,258,259],{"class":69},"const",[63,261,262],{"class":69}," char*",[63,264,265],{"class":149}," name",[63,267,153],{"class":125},[63,269,259],{"class":69},[63,271,272],{"class":121}," std",[63,274,132],{"class":125},[63,276,51],{"class":121},[63,278,137],{"class":125},[63,280,140],{"class":69},[63,282,143],{"class":125},[63,284,146],{"class":69},[63,286,287],{"class":149}," values",[63,289,161],{"class":125},[63,291,293],{"class":65,"line":292},16,[63,294,167],{"class":125},[63,296,298,301,304,307,310,312,315],{"class":65,"line":297},17,[63,299,300],{"class":121},"    std",[63,302,303],{"class":125},"::cout ",[63,305,306],{"class":69},"\u003C\u003C",[63,308,309],{"class":125}," name ",[63,311,306],{"class":69},[63,313,314],{"class":73}," \": \"",[63,316,317],{"class":125},";\n",[63,319,321,323,325,327],{"class":65,"line":320},18,[63,322,173],{"class":69},[63,324,176],{"class":125},[63,326,140],{"class":69},[63,328,329],{"class":125}," value : values)\n",[63,331,333],{"class":65,"line":332},19,[63,334,211],{"class":125},[63,336,338,341,343,345,348,350,353],{"class":65,"line":337},20,[63,339,340],{"class":121},"        std",[63,342,303],{"class":125},[63,344,306],{"class":69},[63,346,347],{"class":125}," value ",[63,349,306],{"class":69},[63,351,352],{"class":73}," \" \"",[63,354,317],{"class":125},[63,356,358],{"class":65,"line":357},21,[63,359,235],{"class":125},[63,361,363,365,367,369,372,375,378],{"class":65,"line":362},22,[63,364,300],{"class":121},[63,366,303],{"class":125},[63,368,306],{"class":69},[63,370,371],{"class":73}," \"",[63,373,374],{"class":187},"\\n",[63,376,377],{"class":73},"\"",[63,379,317],{"class":125},[63,381,383],{"class":65,"line":382},23,[63,384,241],{"class":125},[63,386,388],{"class":65,"line":387},24,[63,389,105],{"emptyLinePlaceholder":104},[63,391,393,395,398],{"class":65,"line":392},25,[63,394,140],{"class":69},[63,396,397],{"class":121}," main",[63,399,400],{"class":125},"()\n",[63,402,404],{"class":65,"line":403},26,[63,405,167],{"class":125},[63,407,409],{"class":65,"line":408},27,[63,410,411],{"class":111},"    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[63,413,415,417,420,423],{"class":65,"line":414},28,[63,416,300],{"class":121},[63,418,419],{"class":125},"::vector",[63,421,422],{"class":69},"\u003Cint>",[63,424,425],{"class":125}," left;\n",[63,427,429,431,433,435],{"class":65,"line":428},29,[63,430,300],{"class":121},[63,432,419],{"class":125},[63,434,422],{"class":69},[63,436,437],{"class":125}," right;\n",[63,439,441],{"class":65,"line":440},30,[63,442,105],{"emptyLinePlaceholder":104},[63,444,446],{"class":65,"line":445},31,[63,447,448],{"class":111},"    \u002F\u002F 创建子线程，让这部分代码和 main 线程并发运行。\n",[63,450,452,454,457,460,463,465,467,470,473,476],{"class":65,"line":451},32,[63,453,300],{"class":121},[63,455,456],{"class":125},"::thread ",[63,458,459],{"class":121},"t1",[63,461,462],{"class":125},"(fill_numbers, ",[63,464,129],{"class":121},[63,466,132],{"class":125},[63,468,469],{"class":121},"ref",[63,471,472],{"class":125},"(left), ",[63,474,475],{"class":187},"1",[63,477,478],{"class":125},");\n",[63,480,482,484,486,489,491,493,495,497,500,503],{"class":65,"line":481},33,[63,483,300],{"class":121},[63,485,456],{"class":125},[63,487,488],{"class":121},"t2",[63,490,462],{"class":125},[63,492,129],{"class":121},[63,494,132],{"class":125},[63,496,469],{"class":121},[63,498,499],{"class":125},"(right), ",[63,501,502],{"class":187},"10",[63,504,478],{"class":125},[63,506,508],{"class":65,"line":507},34,[63,509,105],{"emptyLinePlaceholder":104},[63,511,513],{"class":65,"line":512},35,[63,514,515],{"class":111},"    \u002F\u002F join 会等待子线程结束，避免 main 提前退出。\n",[63,517,519,522,525],{"class":65,"line":518},36,[63,520,521],{"class":125},"    t1.",[63,523,524],{"class":121},"join",[63,526,527],{"class":125},"();\n",[63,529,531,534,536],{"class":65,"line":530},37,[63,532,533],{"class":125},"    t2.",[63,535,524],{"class":121},[63,537,527],{"class":125},[63,539,541],{"class":65,"line":540},38,[63,542,105],{"emptyLinePlaceholder":104},[63,544,546,549,551,554],{"class":65,"line":545},39,[63,547,548],{"class":121},"    print_numbers",[63,550,126],{"class":125},[63,552,553],{"class":73},"\"left\"",[63,555,556],{"class":125},", left);\n",[63,558,560,562,564,567],{"class":65,"line":559},40,[63,561,548],{"class":121},[63,563,126],{"class":125},[63,565,566],{"class":73},"\"right\"",[63,568,569],{"class":125},", right);\n",[63,571,573,575,577,579,582,584,586],{"class":65,"line":572},41,[63,574,300],{"class":121},[63,576,303],{"class":125},[63,578,306],{"class":69},[63,580,581],{"class":73}," \"done",[63,583,374],{"class":187},[63,585,377],{"class":73},[63,587,317],{"class":125},[63,589,591],{"class":65,"line":590},42,[63,592,105],{"emptyLinePlaceholder":104},[63,594,596,599,601],{"class":65,"line":595},43,[63,597,598],{"class":69},"    return",[63,600,188],{"class":187},[63,602,317],{"class":125},[63,604,606],{"class":65,"line":605},44,[63,607,241],{"class":125},[14,609,610,614],{},[611,612,613],"strong",{},"运行结果","：",[54,616,621],{"className":617,"code":619,"language":620,"meta":59},[618],"language-text","left: 1 2 3\nright: 10 11 12\ndone\n","text",[17,622,619],{"__ignoreMap":59},[14,624,625,626,629,630,633,634,636,637,639],{},"这里使用 ",[17,627,628],{},"std::ref(left)"," 和 ",[17,631,632],{},"std::ref(right)","，表示把 ",[17,635,51],{}," 按引用传给线程函数。否则 ",[17,638,19],{}," 会尝试复制参数。",[42,641,643],{"id":642},"示例-2顺序等待-vs-并发等待","示例 2：顺序等待 vs 并发等待",[14,645,646],{},"一个任务等待 1 秒，顺序写法和线程写法看起来都只是\"等完了\"。两个任务各等 1 秒时，区别就明显了：",[648,649,650,654],"ul",{},[651,652,653],"li",{},"顺序执行：先等 A，再等 B，总共约 2 秒。",[651,655,656],{},"两个线程：A 和 B 同时等，总共约 1 秒。",[54,658,660],{"className":56,"code":659,"language":58,"meta":59,"style":59},"#include \u003Cchrono>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nusing namespace std::chrono;\n\nvoid wait_one_second()\n{\n    std::this_thread::sleep_for(seconds(1));\n}\n\nlong long run_sync()\n{\n    auto begin = steady_clock::now();\n\n    wait_one_second();\n    wait_one_second();\n\n    auto end = steady_clock::now();\n    return duration_cast\u003Cseconds>(end - begin).count();\n}\n\nlong long run_threads()\n{\n    auto begin = steady_clock::now();\n\n    \u002F\u002F 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread t1(wait_one_second);\n    std::thread t2(wait_one_second);\n\n    \u002F\u002F join 会等待子线程结束，避免 main 提前退出。\n    t1.join();\n    t2.join();\n\n    auto end = steady_clock::now();\n    return duration_cast\u003Cseconds>(end - begin).count();\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    std::cout \u003C\u003C \"sync seconds = \" \u003C\u003C run_sync() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"thread seconds = \" \u003C\u003C run_threads() \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[17,661,662,669,675,681,685,702,706,715,719,745,749,753,766,770,790,794,801,807,811,828,853,857,861,872,876,892,896,900,911,921,925,929,937,945,949,965,985,989,993,1001,1005,1009,1038,1065,1069,1078],{"__ignoreMap":59},[63,663,664,666],{"class":65,"line":66},[63,665,70],{"class":69},[63,667,668],{"class":73}," \u003Cchrono>\n",[63,670,671,673],{"class":65,"line":77},[63,672,70],{"class":69},[63,674,82],{"class":73},[63,676,677,679],{"class":65,"line":85},[63,678,70],{"class":69},[63,680,90],{"class":73},[63,682,683],{"class":65,"line":93},[63,684,105],{"emptyLinePlaceholder":104},[63,686,687,690,693,695,697,700],{"class":65,"line":101},[63,688,689],{"class":69},"using",[63,691,692],{"class":69}," namespace",[63,694,272],{"class":121},[63,696,132],{"class":125},[63,698,699],{"class":121},"chrono",[63,701,317],{"class":125},[63,703,704],{"class":65,"line":108},[63,705,105],{"emptyLinePlaceholder":104},[63,707,708,710,713],{"class":65,"line":115},[63,709,118],{"class":69},[63,711,712],{"class":121}," wait_one_second",[63,714,400],{"class":125},[63,716,717],{"class":65,"line":164},[63,718,167],{"class":125},[63,720,721,723,725,728,730,733,735,738,740,742],{"class":65,"line":170},[63,722,300],{"class":121},[63,724,132],{"class":125},[63,726,727],{"class":121},"this_thread",[63,729,132],{"class":125},[63,731,732],{"class":121},"sleep_for",[63,734,126],{"class":125},[63,736,737],{"class":121},"seconds",[63,739,126],{"class":125},[63,741,475],{"class":187},[63,743,744],{"class":125},"));\n",[63,746,747],{"class":65,"line":208},[63,748,241],{"class":125},[63,750,751],{"class":65,"line":214},[63,752,105],{"emptyLinePlaceholder":104},[63,754,755,758,761,764],{"class":65,"line":232},[63,756,757],{"class":69},"long",[63,759,760],{"class":69}," long",[63,762,763],{"class":121}," run_sync",[63,765,400],{"class":125},[63,767,768],{"class":65,"line":238},[63,769,167],{"class":125},[63,771,772,775,778,780,783,785,788],{"class":65,"line":244},[63,773,774],{"class":69},"    auto",[63,776,777],{"class":125}," begin ",[63,779,184],{"class":69},[63,781,782],{"class":121}," steady_clock",[63,784,132],{"class":125},[63,786,787],{"class":121},"now",[63,789,527],{"class":125},[63,791,792],{"class":65,"line":249},[63,793,105],{"emptyLinePlaceholder":104},[63,795,796,799],{"class":65,"line":292},[63,797,798],{"class":121},"    wait_one_second",[63,800,527],{"class":125},[63,802,803,805],{"class":65,"line":297},[63,804,798],{"class":121},[63,806,527],{"class":125},[63,808,809],{"class":65,"line":320},[63,810,105],{"emptyLinePlaceholder":104},[63,812,813,815,818,820,822,824,826],{"class":65,"line":332},[63,814,774],{"class":69},[63,816,817],{"class":125}," end ",[63,819,184],{"class":69},[63,821,782],{"class":121},[63,823,132],{"class":125},[63,825,787],{"class":121},[63,827,527],{"class":125},[63,829,830,832,835,837,839,842,845,848,851],{"class":65,"line":337},[63,831,598],{"class":69},[63,833,834],{"class":121}," duration_cast",[63,836,137],{"class":125},[63,838,737],{"class":121},[63,840,841],{"class":125},">(end ",[63,843,844],{"class":69},"-",[63,846,847],{"class":125}," begin).",[63,849,850],{"class":121},"count",[63,852,527],{"class":125},[63,854,855],{"class":65,"line":357},[63,856,241],{"class":125},[63,858,859],{"class":65,"line":362},[63,860,105],{"emptyLinePlaceholder":104},[63,862,863,865,867,870],{"class":65,"line":382},[63,864,757],{"class":69},[63,866,760],{"class":69},[63,868,869],{"class":121}," run_threads",[63,871,400],{"class":125},[63,873,874],{"class":65,"line":387},[63,875,167],{"class":125},[63,877,878,880,882,884,886,888,890],{"class":65,"line":392},[63,879,774],{"class":69},[63,881,777],{"class":125},[63,883,184],{"class":69},[63,885,782],{"class":121},[63,887,132],{"class":125},[63,889,787],{"class":121},[63,891,527],{"class":125},[63,893,894],{"class":65,"line":403},[63,895,105],{"emptyLinePlaceholder":104},[63,897,898],{"class":65,"line":408},[63,899,448],{"class":111},[63,901,902,904,906,908],{"class":65,"line":414},[63,903,300],{"class":121},[63,905,456],{"class":125},[63,907,459],{"class":121},[63,909,910],{"class":125},"(wait_one_second);\n",[63,912,913,915,917,919],{"class":65,"line":428},[63,914,300],{"class":121},[63,916,456],{"class":125},[63,918,488],{"class":121},[63,920,910],{"class":125},[63,922,923],{"class":65,"line":440},[63,924,105],{"emptyLinePlaceholder":104},[63,926,927],{"class":65,"line":445},[63,928,515],{"class":111},[63,930,931,933,935],{"class":65,"line":451},[63,932,521],{"class":125},[63,934,524],{"class":121},[63,936,527],{"class":125},[63,938,939,941,943],{"class":65,"line":481},[63,940,533],{"class":125},[63,942,524],{"class":121},[63,944,527],{"class":125},[63,946,947],{"class":65,"line":507},[63,948,105],{"emptyLinePlaceholder":104},[63,950,951,953,955,957,959,961,963],{"class":65,"line":512},[63,952,774],{"class":69},[63,954,817],{"class":125},[63,956,184],{"class":69},[63,958,782],{"class":121},[63,960,132],{"class":125},[63,962,787],{"class":121},[63,964,527],{"class":125},[63,966,967,969,971,973,975,977,979,981,983],{"class":65,"line":518},[63,968,598],{"class":69},[63,970,834],{"class":121},[63,972,137],{"class":125},[63,974,737],{"class":121},[63,976,841],{"class":125},[63,978,844],{"class":69},[63,980,847],{"class":125},[63,982,850],{"class":121},[63,984,527],{"class":125},[63,986,987],{"class":65,"line":530},[63,988,241],{"class":125},[63,990,991],{"class":65,"line":540},[63,992,105],{"emptyLinePlaceholder":104},[63,994,995,997,999],{"class":65,"line":545},[63,996,140],{"class":69},[63,998,397],{"class":121},[63,1000,400],{"class":125},[63,1002,1003],{"class":65,"line":559},[63,1004,167],{"class":125},[63,1006,1007],{"class":65,"line":572},[63,1008,411],{"class":111},[63,1010,1011,1013,1015,1017,1020,1023,1025,1028,1030,1032,1034,1036],{"class":65,"line":590},[63,1012,300],{"class":121},[63,1014,303],{"class":125},[63,1016,306],{"class":69},[63,1018,1019],{"class":73}," \"sync seconds = \"",[63,1021,1022],{"class":69}," \u003C\u003C",[63,1024,763],{"class":121},[63,1026,1027],{"class":125},"() ",[63,1029,306],{"class":69},[63,1031,371],{"class":73},[63,1033,374],{"class":187},[63,1035,377],{"class":73},[63,1037,317],{"class":125},[63,1039,1040,1042,1044,1046,1049,1051,1053,1055,1057,1059,1061,1063],{"class":65,"line":595},[63,1041,300],{"class":121},[63,1043,303],{"class":125},[63,1045,306],{"class":69},[63,1047,1048],{"class":73}," \"thread seconds = \"",[63,1050,1022],{"class":69},[63,1052,869],{"class":121},[63,1054,1027],{"class":125},[63,1056,306],{"class":69},[63,1058,371],{"class":73},[63,1060,374],{"class":187},[63,1062,377],{"class":73},[63,1064,317],{"class":125},[63,1066,1067],{"class":65,"line":605},[63,1068,105],{"emptyLinePlaceholder":104},[63,1070,1072,1074,1076],{"class":65,"line":1071},45,[63,1073,598],{"class":69},[63,1075,188],{"class":187},[63,1077,317],{"class":125},[63,1079,1081],{"class":65,"line":1080},46,[63,1082,241],{"class":125},[14,1084,1085,614],{},[611,1086,613],{},[54,1088,1091],{"className":1089,"code":1090,"language":620,"meta":59},[618],"sync seconds = 2\nthread seconds = 1\n",[17,1092,1090],{"__ignoreMap":59},[14,1094,1095],{},"这个例子不是说所有任务都应该开线程。线程创建和调度也有成本。非常短的任务，例如只做几次加法，开线程可能反而更慢。",[10,1097,1098],{"id":1098},"常见错误",[14,1100,1101],{},[611,1102,1103],{},"错误 1：忘记 join 或 detach",[54,1105,1107],{"className":56,"code":1106,"language":58,"meta":59,"style":59},"{\n    std::thread t([] {\n        std::cout \u003C\u003C \"work\\n\";\n    });\n} \u002F\u002F t 还是 joinable，程序会 std::terminate\n",[17,1108,1109,1113,1125,1142,1147],{"__ignoreMap":59},[63,1110,1111],{"class":65,"line":66},[63,1112,167],{"class":125},[63,1114,1115,1117,1119,1122],{"class":65,"line":77},[63,1116,300],{"class":121},[63,1118,456],{"class":125},[63,1120,1121],{"class":121},"t",[63,1123,1124],{"class":125},"([] {\n",[63,1126,1127,1129,1131,1133,1136,1138,1140],{"class":65,"line":85},[63,1128,340],{"class":121},[63,1130,303],{"class":125},[63,1132,306],{"class":69},[63,1134,1135],{"class":73}," \"work",[63,1137,374],{"class":187},[63,1139,377],{"class":73},[63,1141,317],{"class":125},[63,1143,1144],{"class":65,"line":93},[63,1145,1146],{"class":125},"    });\n",[63,1148,1149,1152],{"class":65,"line":101},[63,1150,1151],{"class":125},"}",[63,1153,1154],{"class":111}," \u002F\u002F t 还是 joinable，程序会 std::terminate\n",[14,1156,1157,1158,1160,1161,1164],{},"正确做法：在 ",[17,1159,1121],{}," 离开作用域前调用 ",[17,1162,1163],{},"t.join()","。",[14,1166,1167],{},[611,1168,1169],{},"错误 2：线程函数引用了已经销毁的局部变量",[54,1171,1173],{"className":56,"code":1172,"language":58,"meta":59,"style":59},"void start_thread()\n{\n    int value = 42;\n    std::thread t([&value] {\n        std::cout \u003C\u003C value \u003C\u003C \"\\n\";\n    });\n    t.detach();\n}\n",[17,1174,1175,1184,1188,1202,1221,1241,1245,1255],{"__ignoreMap":59},[63,1176,1177,1179,1182],{"class":65,"line":66},[63,1178,118],{"class":69},[63,1180,1181],{"class":121}," start_thread",[63,1183,400],{"class":125},[63,1185,1186],{"class":65,"line":77},[63,1187,167],{"class":125},[63,1189,1190,1193,1195,1197,1200],{"class":65,"line":85},[63,1191,1192],{"class":69},"    int",[63,1194,347],{"class":125},[63,1196,184],{"class":69},[63,1198,1199],{"class":187}," 42",[63,1201,317],{"class":125},[63,1203,1204,1206,1208,1210,1213,1215,1218],{"class":65,"line":93},[63,1205,300],{"class":121},[63,1207,456],{"class":125},[63,1209,1121],{"class":121},[63,1211,1212],{"class":125},"([",[63,1214,146],{"class":69},[63,1216,1217],{"class":149},"value",[63,1219,1220],{"class":125},"] {\n",[63,1222,1223,1225,1227,1229,1231,1233,1235,1237,1239],{"class":65,"line":101},[63,1224,340],{"class":121},[63,1226,303],{"class":125},[63,1228,306],{"class":69},[63,1230,347],{"class":125},[63,1232,306],{"class":69},[63,1234,371],{"class":73},[63,1236,374],{"class":187},[63,1238,377],{"class":73},[63,1240,317],{"class":125},[63,1242,1243],{"class":65,"line":108},[63,1244,1146],{"class":125},[63,1246,1247,1250,1253],{"class":65,"line":115},[63,1248,1249],{"class":125},"    t.",[63,1251,1252],{"class":121},"detach",[63,1254,527],{"class":125},[63,1256,1257],{"class":65,"line":164},[63,1258,241],{"class":125},[14,1260,1261,1263,1264,1267,1268,1270],{},[17,1262,33],{}," 后线程可能晚于 ",[17,1265,1266],{},"start_thread()"," 返回才执行，此时 ",[17,1269,1217],{}," 已经销毁。正确做法是按值捕获，或者用智能指针管理生命周期。",[10,1272,1273],{"id":1273},"小结",[648,1275,1276,1281,1286,1294,1300],{},[651,1277,1278,1280],{},[17,1279,19],{}," 创建后会立刻启动。",[651,1282,1283,1285],{},[17,1284,29],{}," 表示等待线程完成。",[651,1287,1288,1289,1291,1292,1164],{},"初学阶段优先用 ",[17,1290,29],{},"，少用 ",[17,1293,33],{},[651,1295,1296,1297,1164],{},"向线程函数传引用参数时要用 ",[17,1298,1299],{},"std::ref",[651,1301,1302],{},"两个耗时任务同时推进时，才能直观看出并发的价值。",[1304,1305,1306],"style",{},"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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 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 .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);}",{"title":59,"searchDepth":77,"depth":77,"links":1308},[1309,1310,1314,1315],{"id":12,"depth":77,"text":12},{"id":40,"depth":77,"text":40,"children":1311},[1312,1313],{"id":44,"depth":85,"text":45},{"id":642,"depth":85,"text":643},{"id":1098,"depth":77,"text":1098},{"id":1273,"depth":77,"text":1273},"2000-1900-0100","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread",{"title":5,"description":59},"wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","NkW4Be-CqyFVyrWzQKekYcJbp6uMkb9PuALuZO8w2nA",[1329,1335,1340,1345,1350,1355,1360,1365,1370,1375,1380,1385,1390,1395,1400,1405,1410,1415,1420,1425,1430,1435,1440,1445,1450,1455,1460,1465,1470,1475,1480,1485,1490,1495,1500,1505,1509,1514,1519,1524,1529,1534,1539,1544,1549,1554,1559,1564,1569,1574,1579,1584,1585,1590,1595,1600,1605,1610,1615,1620,1625,1630,1635,1640,1645,1650,1655,1660,1665,1670,1675,1680,1685,1690,1695,1700,1705,1710],{"path":1330,"stem":1331,"title":1332,"date":1317,"chapterOrder":1333,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1336,"stem":1337,"title":1338,"date":1317,"chapterOrder":1339,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":1341,"stem":1342,"title":1343,"date":1317,"chapterOrder":1344,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1346,"stem":1347,"title":1348,"date":1317,"chapterOrder":1349,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":1351,"stem":1352,"title":1353,"date":1317,"chapterOrder":1354,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":1356,"stem":1357,"title":1358,"date":1317,"chapterOrder":1359,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":1361,"stem":1362,"title":1363,"date":1317,"chapterOrder":1364,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":1366,"stem":1367,"title":1368,"date":1317,"chapterOrder":1369,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":1371,"stem":1372,"title":1373,"date":1317,"chapterOrder":1374,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":1376,"stem":1377,"title":1378,"date":1317,"chapterOrder":1379,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":1381,"stem":1382,"title":1383,"date":1317,"chapterOrder":1384,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1386,"stem":1387,"title":1388,"date":1317,"chapterOrder":1389,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":1391,"stem":1392,"title":1393,"date":1317,"chapterOrder":1394,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":1396,"stem":1397,"title":1398,"date":1317,"chapterOrder":1399,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":1401,"stem":1402,"title":1403,"date":1317,"chapterOrder":1404,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1406,"stem":1407,"title":1408,"date":1317,"chapterOrder":1409,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1411,"stem":1412,"title":1413,"date":1317,"chapterOrder":1414,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1416,"stem":1417,"title":1418,"date":1317,"chapterOrder":1419,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":1421,"stem":1422,"title":1423,"date":1317,"chapterOrder":1424,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":1426,"stem":1427,"title":1428,"date":1317,"chapterOrder":1429,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":1431,"stem":1432,"title":1433,"date":1317,"chapterOrder":1434,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":1436,"stem":1437,"title":1438,"date":1317,"chapterOrder":1439,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":1441,"stem":1442,"title":1443,"date":1317,"chapterOrder":1444,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":1446,"stem":1447,"title":1448,"date":1317,"chapterOrder":1449,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":1451,"stem":1452,"title":1453,"date":1317,"chapterOrder":1454,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1456,"stem":1457,"title":1458,"date":1317,"chapterOrder":1459,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":1461,"stem":1462,"title":1463,"date":1317,"chapterOrder":1464,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-yu-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector与deque容器","vector与deque容器","1800-0400",{"path":1466,"stem":1467,"title":1468,"date":1317,"chapterOrder":1469,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-stack-queue-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-stack-queue-list容器","stack \u002F queue \u002F list 容器","1800-0500",{"path":1471,"stem":1472,"title":1473,"date":1317,"chapterOrder":1474,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-set-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-set-map容器","set \u002F map 容器","1800-0600",{"path":1476,"stem":1477,"title":1478,"date":1317,"chapterOrder":1479,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-函数对象与谓词","函数对象与谓词","1800-0700",{"path":1481,"stem":1482,"title":1483,"date":1317,"chapterOrder":1484,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-常用算法","常用算法","1800-0800",{"path":1486,"stem":1487,"title":1488,"date":1317,"chapterOrder":1489,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":1491,"stem":1492,"title":1493,"date":1317,"chapterOrder":1494,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":1496,"stem":1497,"title":1498,"date":1317,"chapterOrder":1499,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":1501,"stem":1502,"title":1503,"date":1317,"chapterOrder":1504,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":1506,"stem":1507,"title":689,"date":1317,"chapterOrder":1508,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":1510,"stem":1511,"title":1512,"date":1317,"chapterOrder":1513,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1515,"stem":1516,"title":1517,"date":1317,"chapterOrder":1518,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1520,"stem":1521,"title":1522,"date":1317,"chapterOrder":1523,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":1525,"stem":1526,"title":1527,"date":1317,"chapterOrder":1528,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":1530,"stem":1531,"title":1532,"date":1317,"chapterOrder":1533,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":1535,"stem":1536,"title":1537,"date":1317,"chapterOrder":1538,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":1540,"stem":1541,"title":1542,"date":1317,"chapterOrder":1543,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1545,"stem":1546,"title":1547,"date":1317,"chapterOrder":1548,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1550,"stem":1551,"title":1552,"date":1317,"chapterOrder":1553,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1555,"stem":1556,"title":1557,"date":1317,"chapterOrder":1558,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1560,"stem":1561,"title":1562,"date":1317,"chapterOrder":1563,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1565,"stem":1566,"title":1567,"date":1317,"chapterOrder":1568,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1570,"stem":1571,"title":1572,"date":1317,"chapterOrder":1573,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1575,"stem":1576,"title":1577,"date":1317,"chapterOrder":1578,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1580,"stem":1581,"title":1582,"date":1317,"chapterOrder":1583,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1324,"stem":1326,"title":5,"date":1317,"chapterOrder":1316,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},{"path":1586,"stem":1587,"title":1588,"date":1317,"chapterOrder":1589,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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 与 lock_guard","2000-1900-0200",{"path":1591,"stem":1592,"title":1593,"date":1317,"chapterOrder":1594,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1596,"stem":1597,"title":1598,"date":1317,"chapterOrder":1599,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1601,"stem":1602,"title":1603,"date":1317,"chapterOrder":1604,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":1606,"stem":1607,"title":1608,"date":1317,"chapterOrder":1609,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1611,"stem":1612,"title":1613,"date":1317,"chapterOrder":1614,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":1616,"stem":1617,"title":1618,"date":1317,"chapterOrder":1619,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":1621,"stem":1622,"title":1623,"date":1317,"chapterOrder":1624,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1626,"stem":1627,"title":1628,"date":1317,"chapterOrder":1629,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1631,"stem":1632,"title":1633,"date":1317,"chapterOrder":1634,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1636,"stem":1637,"title":1638,"date":1317,"chapterOrder":1639,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1641,"stem":1642,"title":1643,"date":1317,"chapterOrder":1644,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1646,"stem":1647,"title":1648,"date":1317,"chapterOrder":1649,"chapterDepth":77,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1651,"stem":1652,"title":1653,"date":1317,"chapterOrder":1654,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1656,"stem":1657,"title":1658,"date":1317,"chapterOrder":1659,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1661,"stem":1662,"title":1663,"date":1317,"chapterOrder":1664,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1666,"stem":1667,"title":1668,"date":1317,"chapterOrder":1669,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1671,"stem":1672,"title":1673,"date":1317,"chapterOrder":1674,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1676,"stem":1677,"title":1678,"date":1317,"chapterOrder":1679,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":1681,"stem":1682,"title":1683,"date":1317,"chapterOrder":1684,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1686,"stem":1687,"title":1688,"date":1317,"chapterOrder":1689,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1691,"stem":1692,"title":1693,"date":1317,"chapterOrder":1694,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1696,"stem":1697,"title":1698,"date":1317,"chapterOrder":1699,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1701,"stem":1702,"title":1703,"date":1317,"chapterOrder":1704,"chapterDepth":66,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\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":1706,"stem":1707,"title":1708,"date":1317,"chapterOrder":1709,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":1322},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":1319,"stem":1711,"title":1712,"date":1317,"chapterOrder":1713,"chapterDepth":1334,"docKey":1318,"docRoot":1319,"docTitle":1320,"isWikiDoc":104,"isWikiIndex":104},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",null,1784505234802]