[{"data":1,"prerenderedAt":1761},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread":1334,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread":1745,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread":1760},{"id":4,"title":5,"body":6,"canonicalPath":1316,"chapter":1317,"chapterSort":1318,"date":1319,"description":59,"docI18nKey":1320,"docKey":1321,"docRoot":1322,"docTitle":1323,"extension":1324,"i18nKey":1325,"isBlogPost":1326,"isWikiDoc":104,"isWikiIndex":1326,"layout":1327,"legacyPath":1328,"locale":1329,"localeSlug":1330,"meta":1331,"navigation":104,"path":1316,"seo":1332,"sourcePath":1328,"sourceStem":1325,"stem":1325,"wikiDepth":66,"__hash__":1333},"content/wiki/2023-10-05-Cplusplus教学/ch18-19-1-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// 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    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    std::vector\u003Cint> left;\n    std::vector\u003Cint> right;\n\n    // 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread t1(fill_numbers, std::ref(left), 1);\n    std::thread t2(fill_numbers, std::ref(right), 10);\n\n    // 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","// 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},"    // 程序从 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},"    // 创建子线程，让这部分代码和 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},"    // 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    // 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread t1(wait_one_second);\n    std::thread t2(wait_one_second);\n\n    // 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    // 程序从 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} // 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}," // 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},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","18.19.1",18190100,"2023-10-05","wiki/2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki/2023-10-05-Cplusplus教学/ch18-19-1-std-thread",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","zh-CN","zh-cn",{},{"title":5,"description":59},"gvb8rhQJY4eILy2GDMBf6UwJ4Wr9e4l-5W2bFm5emu4",[1335,1340,1345,1351,1357,1363,1369,1375,1381,1387,1393,1399,1405,1411,1417,1423,1429,1435,1441,1447,1453,1459,1465,1471,1477,1483,1489,1495,1501,1507,1513,1519,1525,1531,1532,1538,1544,1550,1556,1562,1568,1574,1579,1585,1591,1597,1603,1609,1615,1621,1627,1633,1639,1645,1651,1657,1663,1669,1675,1681,1687,1693,1699,1705,1711,1717,1723,1729,1735,1741],{"path":1336,"stem":1337,"title":1338,"date":1319,"chapter":475,"chapterSort":1339,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch1-c-ji-chu-chu-shi","wiki/2023-10-05-Cplusplus教学/ch1-C++基础初识","C++基础初识",1000000,{"path":1341,"stem":1342,"title":1343,"date":1319,"chapter":502,"chapterSort":1344,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch10-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch10-内存分区与生命周期","内存分区与生命周期",10000000,{"path":1346,"stem":1347,"title":1348,"date":1319,"chapter":1349,"chapterSort":1350,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":1352,"stem":1353,"title":1354,"date":1319,"chapter":1355,"chapterSort":1356,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch12-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch12-函数提高与命名空间","函数提高与命名空间","12",12000000,{"path":1358,"stem":1359,"title":1360,"date":1319,"chapter":1361,"chapterSort":1362,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":1364,"stem":1365,"title":1366,"date":1319,"chapter":1367,"chapterSort":1368,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-2-dui-xiang-chu-shi-hua-he-qing-li","wiki/2023-10-05-Cplusplus教学/ch13-2-对象初始化和清理","对象初始化和清理","13.2",13020000,{"path":1370,"stem":1371,"title":1372,"date":1319,"chapter":1373,"chapterSort":1374,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-3-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch13-3-对象模型与this指针","对象模型与this指针","13.3",13030000,{"path":1376,"stem":1377,"title":1378,"date":1319,"chapter":1379,"chapterSort":1380,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-4-you-yuan-yu-yun-suan-fu-zhong-zai","wiki/2023-10-05-Cplusplus教学/ch13-4-友元与运算符重载","友元与运算符重载","13.4",13040000,{"path":1382,"stem":1383,"title":1384,"date":1319,"chapter":1385,"chapterSort":1386,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":1388,"stem":1389,"title":1390,"date":1319,"chapter":1391,"chapterSort":1392,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":1394,"stem":1395,"title":1396,"date":1319,"chapter":1397,"chapterSort":1398,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":1400,"stem":1401,"title":1402,"date":1319,"chapter":1403,"chapterSort":1404,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":1406,"stem":1407,"title":1408,"date":1319,"chapter":1409,"chapterSort":1410,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":1412,"stem":1413,"title":1414,"date":1319,"chapter":1415,"chapterSort":1416,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-1-stl-chu-shi","wiki/2023-10-05-Cplusplus教学/ch16-1-STL初识","STL初识","16.1",16010000,{"path":1418,"stem":1419,"title":1420,"date":1319,"chapter":1421,"chapterSort":1422,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-2-std-array","wiki/2023-10-05-Cplusplus教学/ch16-2-std-array","std::array","16.2",16020000,{"path":1424,"stem":1425,"title":1426,"date":1319,"chapter":1427,"chapterSort":1428,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-3-string-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-3-string容器","string容器","16.3",16030000,{"path":1430,"stem":1431,"title":1432,"date":1319,"chapter":1433,"chapterSort":1434,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-4-vector-yu-deque-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-4-vector与deque容器","vector与deque容器","16.4",16040000,{"path":1436,"stem":1437,"title":1438,"date":1319,"chapter":1439,"chapterSort":1440,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-5-stack-queue-list-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-5-stack-queue-list容器","stack / queue / list 容器","16.5",16050000,{"path":1442,"stem":1443,"title":1444,"date":1319,"chapter":1445,"chapterSort":1446,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-6-set-map-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-6-set-map容器","set / map 容器","16.6",16060000,{"path":1448,"stem":1449,"title":1450,"date":1319,"chapter":1451,"chapterSort":1452,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-7-han-shu-dui-xiang-yu-wei-ci","wiki/2023-10-05-Cplusplus教学/ch16-7-函数对象与谓词","函数对象与谓词","16.7",16070000,{"path":1454,"stem":1455,"title":1456,"date":1319,"chapter":1457,"chapterSort":1458,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-8-chang-yong-suan-fa","wiki/2023-10-05-Cplusplus教学/ch16-8-常用算法","常用算法","16.8",16080000,{"path":1460,"stem":1461,"title":1462,"date":1319,"chapter":1463,"chapterSort":1464,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-stl-ti-gao-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch16-STL提高编程","STL提高编程","16",16000000,{"path":1466,"stem":1467,"title":1468,"date":1319,"chapter":1469,"chapterSort":1470,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch17-c-lei-xing-zhuan-huan","wiki/2023-10-05-Cplusplus教学/ch17-C++类型转换","C++类型转换","17",17000000,{"path":1472,"stem":1473,"title":1474,"date":1319,"chapter":1475,"chapterSort":1476,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-1-auto","wiki/2023-10-05-Cplusplus教学/ch18-1-auto","auto","18.1",18010000,{"path":1478,"stem":1479,"title":1480,"date":1319,"chapter":1481,"chapterSort":1482,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义","右值引用和移动语义","18.10",18100000,{"path":1484,"stem":1485,"title":1486,"date":1319,"chapter":1487,"chapterSort":1488,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-11-lambda-biao-da-shi","wiki/2023-10-05-Cplusplus教学/ch18-11-Lambda表达式","Lambda 表达式","18.11",18110000,{"path":1490,"stem":1491,"title":1492,"date":1319,"chapter":1493,"chapterSort":1494,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","wiki/2023-10-05-Cplusplus教学/ch18-12-std-function","std::function","18.12",18120000,{"path":1496,"stem":1497,"title":1498,"date":1319,"chapter":1499,"chapterSort":1500,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","std::bind","18.13",18130000,{"path":1502,"stem":1503,"title":1504,"date":1319,"chapter":1505,"chapterSort":1506,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-14-std-optional","wiki/2023-10-05-Cplusplus教学/ch18-14-std-optional","std::optional","18.14",18140000,{"path":1508,"stem":1509,"title":1510,"date":1319,"chapter":1511,"chapterSort":1512,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":1514,"stem":1515,"title":1516,"date":1319,"chapter":1517,"chapterSort":1518,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-16-std-span","wiki/2023-10-05-Cplusplus教学/ch18-16-std-span","std::span","18.16",18160000,{"path":1520,"stem":1521,"title":1522,"date":1319,"chapter":1523,"chapterSort":1524,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-17-std-format-print","wiki/2023-10-05-Cplusplus教学/ch18-17-std-format-print","std::format / std::print","18.17",18170000,{"path":1526,"stem":1527,"title":1528,"date":1319,"chapter":1529,"chapterSort":1530,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-18-std-chrono","wiki/2023-10-05-Cplusplus教学/ch18-18-std-chrono","std::chrono","18.18",18180000,{"path":1316,"stem":1325,"title":5,"date":1319,"chapter":1317,"chapterSort":1318,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},{"path":1533,"stem":1534,"title":1535,"date":1319,"chapter":1536,"chapterSort":1537,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-2-mutex-lock-guard","wiki/2023-10-05-Cplusplus教学/ch18-19-2-mutex-lock-guard","mutex 与 lock_guard","18.19.2",18190200,{"path":1539,"stem":1540,"title":1541,"date":1319,"chapter":1542,"chapterSort":1543,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-3-std-atomic","wiki/2023-10-05-Cplusplus教学/ch18-19-3-std-atomic","std::atomic","18.19.3",18190300,{"path":1545,"stem":1546,"title":1547,"date":1319,"chapter":1548,"chapterSort":1549,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable","condition_variable","18.19.4",18190400,{"path":1551,"stem":1552,"title":1553,"date":1319,"chapter":1554,"chapterSort":1555,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-bing-fa-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch18-19-并发编程","并发编程","18.19",18190000,{"path":1557,"stem":1558,"title":1559,"date":1319,"chapter":1560,"chapterSort":1561,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-2-nullptr","wiki/2023-10-05-Cplusplus教学/ch18-2-nullptr","nullptr","18.2",18020000,{"path":1563,"stem":1564,"title":1565,"date":1319,"chapter":1566,"chapterSort":1567,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-20-std-filesystem","wiki/2023-10-05-Cplusplus教学/ch18-20-std-filesystem","std::filesystem","18.20",18200000,{"path":1569,"stem":1570,"title":1571,"date":1319,"chapter":1572,"chapterSort":1573,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-21-modules-jian-jie","wiki/2023-10-05-Cplusplus教学/ch18-21-modules简介","modules 简介","18.21",18210000,{"path":1575,"stem":1576,"title":689,"date":1319,"chapter":1577,"chapterSort":1578,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","18.3",18030000,{"path":1580,"stem":1581,"title":1582,"date":1319,"chapter":1583,"chapterSort":1584,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-4-enum-class","wiki/2023-10-05-Cplusplus教学/ch18-4-enum-class","enum class","18.4",18040000,{"path":1586,"stem":1587,"title":1588,"date":1319,"chapter":1589,"chapterSort":1590,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-5-fan-wei-for-xun-huan","wiki/2023-10-05-Cplusplus教学/ch18-5-范围for循环","范围 for 循环","18.5",18050000,{"path":1592,"stem":1593,"title":1594,"date":1319,"chapter":1595,"chapterSort":1596,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-6-jie-gou-hua-bang-ding","wiki/2023-10-05-Cplusplus教学/ch18-6-结构化绑定","结构化绑定","18.6",18060000,{"path":1598,"stem":1599,"title":1600,"date":1319,"chapter":1601,"chapterSort":1602,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-7-constexpr","wiki/2023-10-05-Cplusplus教学/ch18-7-constexpr","constexpr","18.7",18070000,{"path":1604,"stem":1605,"title":1606,"date":1319,"chapter":1607,"chapterSort":1608,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","wiki/2023-10-05-Cplusplus教学/ch18-8-RAII","RAII","18.8",18080000,{"path":1610,"stem":1611,"title":1612,"date":1319,"chapter":1613,"chapterSort":1614,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针","智能指针","18.9",18090000,{"path":1616,"stem":1617,"title":1618,"date":1319,"chapter":1619,"chapterSort":1620,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":1622,"stem":1623,"title":1624,"date":1319,"chapter":1625,"chapterSort":1626,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-1-ding-shi-qi-yu-yi-bu-io","wiki/2023-10-05-Cplusplus教学/ch19-1-1-定时器与异步IO","定时器与异步 IO","19.1.1",19010100,{"path":1628,"stem":1629,"title":1630,"date":1319,"chapter":1631,"chapterSort":1632,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-2-boost-asio-ji-chu","wiki/2023-10-05-Cplusplus教学/ch19-1-2-Boost.Asio基础","Boost.Asio 基础","19.1.2",19010200,{"path":1634,"stem":1635,"title":1636,"date":1319,"chapter":1637,"chapterSort":1638,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-3-chuan-kou-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-3-串口通信","串口通信","19.1.3",19010300,{"path":1640,"stem":1641,"title":1642,"date":1319,"chapter":1643,"chapterSort":1644,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-4-tcp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-4-TCP通信","TCP 通信","19.1.4",19010400,{"path":1646,"stem":1647,"title":1648,"date":1319,"chapter":1649,"chapterSort":1650,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-5-udp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-5-UDP通信","UDP 通信","19.1.5",19010500,{"path":1652,"stem":1653,"title":1654,"date":1319,"chapter":1655,"chapterSort":1656,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-6-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch19-1-6-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","19.1.6",19010600,{"path":1658,"stem":1659,"title":1660,"date":1319,"chapter":1661,"chapterSort":1662,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-boost-asio-yi-bu-io-ku","wiki/2023-10-05-Cplusplus教学/ch19-1-Boost.Asio异步IO库","Boost.Asio异步IO库","19.1",19010000,{"path":1664,"stem":1665,"title":1666,"date":1319,"chapter":1667,"chapterSort":1668,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-2-eigen-xian-xing-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-2-Eigen线性代数库","Eigen线性代数库","19.2",19020000,{"path":1670,"stem":1671,"title":1672,"date":1319,"chapter":1673,"chapterSort":1674,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-3-opencv-ji-suan-ji-shi-jue-ku","wiki/2023-10-05-Cplusplus教学/ch19-3-OpenCV计算机视觉库","OpenCV计算机视觉库","19.3",19030000,{"path":1676,"stem":1677,"title":1678,"date":1319,"chapter":1679,"chapterSort":1680,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-4-pcl-dian-yun-ku","wiki/2023-10-05-Cplusplus教学/ch19-4-PCL点云库","PCL点云库","19.4",19040000,{"path":1682,"stem":1683,"title":1684,"date":1319,"chapter":1685,"chapterSort":1686,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-5-sophus-li-qun-li-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-5-Sophus李群李代数库","Sophus 李群李代数库","19.5",19050000,{"path":1688,"stem":1689,"title":1690,"date":1319,"chapter":1691,"chapterSort":1692,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":1694,"stem":1695,"title":1696,"date":1319,"chapter":1697,"chapterSort":1698,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch2-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki/2023-10-05-Cplusplus教学/ch2-数据类型与数据存放","数据类型与数据存放","2",2000000,{"path":1700,"stem":1701,"title":1702,"date":1319,"chapter":1703,"chapterSort":1704,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出","3",3000000,{"path":1706,"stem":1707,"title":1708,"date":1319,"chapter":1709,"chapterSort":1710,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符","4",4000000,{"path":1712,"stem":1713,"title":1714,"date":1319,"chapter":1715,"chapterSort":1716,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构","5",5000000,{"path":1718,"stem":1719,"title":1720,"date":1319,"chapter":1721,"chapterSort":1722,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组","6",6000000,{"path":1724,"stem":1725,"title":1726,"date":1319,"chapter":1727,"chapterSort":1728,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件","7",7000000,{"path":1730,"stem":1731,"title":1732,"date":1319,"chapter":1733,"chapterSort":1734,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针","8",8000000,{"path":1736,"stem":1737,"title":1738,"date":1319,"chapter":1739,"chapterSort":1740,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":1326},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch9-jie-gou-ti-yu-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch9-结构体与共用体","结构体与共用体","9",9000000,{"path":1322,"stem":1742,"title":1743,"date":1319,"chapter":1327,"chapterSort":1744,"docKey":1321,"docRoot":1322,"docTitle":1323,"isWikiDoc":104,"isWikiIndex":104},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":1746},[1747,1750,1753,1756,1759],{"path":1748,"localeSlug":1749,"i18nKey":1325},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","en-us",{"path":1751,"localeSlug":1752,"i18nKey":1325},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","zh-hant",{"path":1754,"localeSlug":1755,"i18nKey":1325},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","zh-hk",{"path":1757,"localeSlug":1758,"i18nKey":1325},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","zh-tw",{"path":1316,"localeSlug":1330,"i18nKey":1325},[1748,1328,1751,1328,1754,1328,1757,1328,1316,1328],1780663037919]