[{"data":1,"prerenderedAt":4945},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1100-std-thread":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":4386,"wiki:author-members":4933},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":150,"chapterOrder":4373,"date":4374,"description":4375,"docKey":4376,"docRoot":4377,"docTitle":4378,"extension":4379,"isWikiDoc":161,"isWikiIndex":4380,"meta":4381,"navigation":161,"path":4382,"seo":4383,"stem":4384,"wikiDepth":115,"__hash__":4385},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread.md","std::thread",[7],"董佳辉",{"type":9,"value":10,"toc":4332},"minimark",[11,22,25,62,67,74,85,91,101,104,127,130,133,338,343,349,355,367,388,391,622,626,632,641,664,668,671,708,711,725,728,742,745,749,875,879,885,888,897,900,914,921,925,1019,1023,1029,1035,1038,1167,1171,1177,1180,1183,1326,1330,1336,1338,1352,1355,1367,1370,1378,1385,1388,1391,1397,1399,1460,1466,1469,1472,1603,1607,1613,1616,1623,1626,1646,1649,1666,1668,1810,1814,1819,1825,1846,1849,1855,1862,1878,1880,1955,1965,1968,1982,1985,1988,2000,2003,2005,2111,2114,2118,2121,2124,2182,2188,2191,2259,2264,2276,2280,2286,2299,2302,2311,2313,2484,2488,2494,2497,2503,2506,2524,2530,2535,2538,2603,2606,2694,2700,2714,2723,2741,2744,2760,2765,2768,2858,2861,2869,2875,2909,2912,2998,3002,3008,3025,3028,3044,3051,3053,3117,3131,3137,3140,3192,3195,3204,3207,3213,3219,3253,3256,3296,3299,3305,3315,3322,3328,3336,3340,3360,3363,3426,3431,3437,3440,3475,3518,3520,3563,3630,3633,3653,3656,3663,3665,3705,3715,3721,3740,3743,3807,3812,3818,3832,3839,3842,3849,3852,4027,4032,4038,4041,4047,4050,4056,4059,4065,4068,4071,4075,4101,4106,4110,4154,4157,4187,4191,4194,4198,4219,4223,4226,4233,4242,4245,4257,4264,4275,4278,4328],[12,13,14,17,18,21],"p",{},[15,16,5],"code",{}," 是 C++11 提供的标准线程管理类，定义在 ",[15,19,20],{},"\u003Cthread>"," 中。",[12,23,24],{},"这一节不只要学会“开一个线程”，更重要的是理解：",[26,27,28,34,37,40,53,56],"ul",{},[29,30,31,33],"li",{},[15,32,5],{}," 对象和实际执行线程是什么关系；",[29,35,36],{},"构造函数里第一个参数和后续参数分别表示什么；",[29,38,39],{},"参数默认是如何保存的；",[29,41,42,45,46,45,49,52],{},[15,43,44],{},"join()","、",[15,47,48],{},"detach()",[15,50,51],{},"joinable()"," 分别改变了什么；",[29,54,55],{},"为什么线程对象的析构函数可能直接终止程序；",[29,57,58,59,61],{},"为什么 ",[15,60,5],{}," 不能复制，但可以移动。",[63,64,66],"h2",{"id":65},"stdthread-基础","std::thread 基础",[68,69,71,73],"h3",{"id":70},"stdthread-对象不是线程本身",[15,72,5],{}," 对象不是“线程本身”",[12,75,76,77,79,80,84],{},"可以把 ",[15,78,5],{}," 理解成一个 ",[81,82,83],"strong",{},"管理线程执行实体的 C++ 对象","。",[12,86,87,88,90],{},"一个 ",[15,89,5],{}," 对象可能处于两种重要状态：",[92,93,99],"pre",{"className":94,"code":96,"language":97,"meta":98},[95],"language-text","未关联任何执行线程\n        或\n关联着一个可 join 的执行线程\n","text","",[15,100,96],{"__ignoreMap":98},[12,102,103],{},"这个状态可以通过：",[92,105,109],{"className":106,"code":107,"language":108,"meta":98,"style":98},"language-cpp shiki shiki-themes github-light github-dark","thread.joinable()\n","cpp",[15,110,111],{"__ignoreMap":98},[112,113,116,120,124],"span",{"class":114,"line":115},"line",1,[112,117,119],{"class":118},"sVt8B","thread.",[112,121,123],{"class":122},"sScJk","joinable",[112,125,126],{"class":118},"()\n",[12,128,129],{},"查询。",[12,131,132],{},"例如：",[92,134,136],{"className":106,"code":135,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nvoid work()\n{\n    std::println(\"Work Done!\");\n}\n\nint main()\n{\n    std::thread t1;\n    std::println(\"{}\", t1.joinable());\n\n    std::thread t2(work);\n    std::println(\"{}\", t2.joinable());\n\n    t2.join();\n    std::println(\"{}\", t2.joinable());\n}\n",[15,137,138,148,156,163,174,180,201,207,212,223,228,236,258,263,277,297,302,314,333],{"__ignoreMap":98},[112,139,140,144],{"class":114,"line":115},[112,141,143],{"class":142},"szBVR","#include",[112,145,147],{"class":146},"sZZnC"," \u003Cprint>\n",[112,149,151,153],{"class":114,"line":150},2,[112,152,143],{"class":142},[112,154,155],{"class":146}," \u003Cthread>\n",[112,157,159],{"class":114,"line":158},3,[112,160,162],{"emptyLinePlaceholder":161},true,"\n",[112,164,166,169,172],{"class":114,"line":165},4,[112,167,168],{"class":142},"void",[112,170,171],{"class":122}," work",[112,173,126],{"class":118},[112,175,177],{"class":114,"line":176},5,[112,178,179],{"class":118},"{\n",[112,181,183,186,189,192,195,198],{"class":114,"line":182},6,[112,184,185],{"class":122},"    std",[112,187,188],{"class":118},"::",[112,190,191],{"class":122},"println",[112,193,194],{"class":118},"(",[112,196,197],{"class":146},"\"Work Done!\"",[112,199,200],{"class":118},");\n",[112,202,204],{"class":114,"line":203},7,[112,205,206],{"class":118},"}\n",[112,208,210],{"class":114,"line":209},8,[112,211,162],{"emptyLinePlaceholder":161},[112,213,215,218,221],{"class":114,"line":214},9,[112,216,217],{"class":142},"int",[112,219,220],{"class":122}," main",[112,222,126],{"class":118},[112,224,226],{"class":114,"line":225},10,[112,227,179],{"class":118},[112,229,231,233],{"class":114,"line":230},11,[112,232,185],{"class":122},[112,234,235],{"class":118},"::thread t1;\n",[112,237,239,241,243,245,247,250,253,255],{"class":114,"line":238},12,[112,240,185],{"class":122},[112,242,188],{"class":118},[112,244,191],{"class":122},[112,246,194],{"class":118},[112,248,249],{"class":146},"\"{}\"",[112,251,252],{"class":118},", t1.",[112,254,123],{"class":122},[112,256,257],{"class":118},"());\n",[112,259,261],{"class":114,"line":260},13,[112,262,162],{"emptyLinePlaceholder":161},[112,264,266,268,271,274],{"class":114,"line":265},14,[112,267,185],{"class":122},[112,269,270],{"class":118},"::thread ",[112,272,273],{"class":122},"t2",[112,275,276],{"class":118},"(work);\n",[112,278,280,282,284,286,288,290,293,295],{"class":114,"line":279},15,[112,281,185],{"class":122},[112,283,188],{"class":118},[112,285,191],{"class":122},[112,287,194],{"class":118},[112,289,249],{"class":146},[112,291,292],{"class":118},", t2.",[112,294,123],{"class":122},[112,296,257],{"class":118},[112,298,300],{"class":114,"line":299},16,[112,301,162],{"emptyLinePlaceholder":161},[112,303,305,308,311],{"class":114,"line":304},17,[112,306,307],{"class":118},"    t2.",[112,309,310],{"class":122},"join",[112,312,313],{"class":118},"();\n",[112,315,317,319,321,323,325,327,329,331],{"class":114,"line":316},18,[112,318,185],{"class":122},[112,320,188],{"class":118},[112,322,191],{"class":122},[112,324,194],{"class":118},[112,326,249],{"class":146},[112,328,292],{"class":118},[112,330,123],{"class":122},[112,332,257],{"class":118},[112,334,336],{"class":114,"line":335},19,[112,337,206],{"class":118},[12,339,340],{},[81,341,342],{},"运行结果：",[92,344,347],{"className":345,"code":346,"language":97,"meta":98},[95],"false\ntrue\nWork Done!\nfalse\n",[15,348,346],{"__ignoreMap":98},[12,350,351,352,354],{},"注意：",[15,353,51],{}," 并不是“线程现在是不是还在运行”。",[12,356,357,358,360,361,363,364,366],{},"即使线程函数已经执行完，只要还没有对对应的 ",[15,359,5],{}," 调用 ",[15,362,44],{}," 或 ",[15,365,48],{},"，它仍然可能：",[92,368,370],{"className":106,"code":369,"language":108,"meta":98,"style":98},"thread.joinable() == true\n",[15,371,372],{"__ignoreMap":98},[112,373,374,376,378,381,384],{"class":114,"line":115},[112,375,119],{"class":118},[112,377,123],{"class":122},[112,379,380],{"class":118},"() ",[112,382,383],{"class":142},"==",[112,385,387],{"class":386},"sj4cs"," true\n",[12,389,390],{},"比如：",[92,392,394],{"className":106,"code":393,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nusing namespace std::chrono_literals;\n\nvoid work()\n{\n    std::println(\"Work Done!\");\n}\n\nint main()\n{\n    std::thread t1;\n    std::println(\"{}\", t1.joinable());\n\n    std::thread t2(work);\n    std::println(\"{}\", t2.joinable());\n\n    std::this_thread::sleep_for(100ms);\n    std::println(\"{}\", t2.joinable());\n\n    t2.join();\n    std::println(\"{}\", t2.joinable());\n}\n",[15,395,396,402,408,412,431,435,443,447,461,465,469,477,481,487,505,509,519,537,541,565,584,589,598,617],{"__ignoreMap":98},[112,397,398,400],{"class":114,"line":115},[112,399,143],{"class":142},[112,401,147],{"class":146},[112,403,404,406],{"class":114,"line":150},[112,405,143],{"class":142},[112,407,155],{"class":146},[112,409,410],{"class":114,"line":158},[112,411,162],{"emptyLinePlaceholder":161},[112,413,414,417,420,423,425,428],{"class":114,"line":165},[112,415,416],{"class":142},"using",[112,418,419],{"class":142}," namespace",[112,421,422],{"class":122}," std",[112,424,188],{"class":118},[112,426,427],{"class":122},"chrono_literals",[112,429,430],{"class":118},";\n",[112,432,433],{"class":114,"line":176},[112,434,162],{"emptyLinePlaceholder":161},[112,436,437,439,441],{"class":114,"line":182},[112,438,168],{"class":142},[112,440,171],{"class":122},[112,442,126],{"class":118},[112,444,445],{"class":114,"line":203},[112,446,179],{"class":118},[112,448,449,451,453,455,457,459],{"class":114,"line":209},[112,450,185],{"class":122},[112,452,188],{"class":118},[112,454,191],{"class":122},[112,456,194],{"class":118},[112,458,197],{"class":146},[112,460,200],{"class":118},[112,462,463],{"class":114,"line":214},[112,464,206],{"class":118},[112,466,467],{"class":114,"line":225},[112,468,162],{"emptyLinePlaceholder":161},[112,470,471,473,475],{"class":114,"line":230},[112,472,217],{"class":142},[112,474,220],{"class":122},[112,476,126],{"class":118},[112,478,479],{"class":114,"line":238},[112,480,179],{"class":118},[112,482,483,485],{"class":114,"line":260},[112,484,185],{"class":122},[112,486,235],{"class":118},[112,488,489,491,493,495,497,499,501,503],{"class":114,"line":265},[112,490,185],{"class":122},[112,492,188],{"class":118},[112,494,191],{"class":122},[112,496,194],{"class":118},[112,498,249],{"class":146},[112,500,252],{"class":118},[112,502,123],{"class":122},[112,504,257],{"class":118},[112,506,507],{"class":114,"line":279},[112,508,162],{"emptyLinePlaceholder":161},[112,510,511,513,515,517],{"class":114,"line":299},[112,512,185],{"class":122},[112,514,270],{"class":118},[112,516,273],{"class":122},[112,518,276],{"class":118},[112,520,521,523,525,527,529,531,533,535],{"class":114,"line":304},[112,522,185],{"class":122},[112,524,188],{"class":118},[112,526,191],{"class":122},[112,528,194],{"class":118},[112,530,249],{"class":146},[112,532,292],{"class":118},[112,534,123],{"class":122},[112,536,257],{"class":118},[112,538,539],{"class":114,"line":316},[112,540,162],{"emptyLinePlaceholder":161},[112,542,543,545,547,550,552,555,557,560,563],{"class":114,"line":335},[112,544,185],{"class":122},[112,546,188],{"class":118},[112,548,549],{"class":122},"this_thread",[112,551,188],{"class":118},[112,553,554],{"class":122},"sleep_for",[112,556,194],{"class":118},[112,558,559],{"class":386},"100",[112,561,562],{"class":142},"ms",[112,564,200],{"class":118},[112,566,568,570,572,574,576,578,580,582],{"class":114,"line":567},20,[112,569,185],{"class":122},[112,571,188],{"class":118},[112,573,191],{"class":122},[112,575,194],{"class":118},[112,577,249],{"class":146},[112,579,292],{"class":118},[112,581,123],{"class":122},[112,583,257],{"class":118},[112,585,587],{"class":114,"line":586},21,[112,588,162],{"emptyLinePlaceholder":161},[112,590,592,594,596],{"class":114,"line":591},22,[112,593,307],{"class":118},[112,595,310],{"class":122},[112,597,313],{"class":118},[112,599,601,603,605,607,609,611,613,615],{"class":114,"line":600},23,[112,602,185],{"class":122},[112,604,188],{"class":118},[112,606,191],{"class":122},[112,608,194],{"class":118},[112,610,249],{"class":146},[112,612,292],{"class":118},[112,614,123],{"class":122},[112,616,257],{"class":118},[112,618,620],{"class":114,"line":619},24,[112,621,206],{"class":118},[12,623,624],{},[81,625,342],{},[92,627,630],{"className":628,"code":629,"language":97,"meta":98},[95],"false\ntrue\nWork Done!\ntrue\nfalse\n",[15,631,629],{"__ignoreMap":98},[12,633,634,635,637,638,84],{},"这里明显任务早就结束了，但延时100ms后去看",[15,636,51],{},"发现还是",[15,639,640],{},"true",[12,642,643,644,646,647,649,650,652,653,656,657,649,659,661,662,84],{},"所以",[15,645,51],{},"看的是他现在能不能被",[15,648,44],{},"或者",[15,651,48],{},"，上面两个例子中：\n当这个线程对象使用默认构造，或者说没有被给一个可调用对象的时候，这时候是",[15,654,655],{},"false",";\n还有这个线程对象已经被",[15,658,44],{},[15,660,48],{},"的时候，也会变成",[15,663,655],{},[68,665,667],{"id":666},"构造函数第一个参数是什么后面的参数是什么","构造函数：第一个参数是什么？后面的参数是什么？",[12,669,670],{},"最常见的构造形式可以概念化为：",[92,672,674],{"className":106,"code":673,"language":108,"meta":98,"style":98},"std::thread t(callable, arg1, arg2, ...);\n",[15,675,676],{"__ignoreMap":98},[112,677,678,681,683,686,689,691,694,697,700,702,705],{"class":114,"line":115},[112,679,680],{"class":122},"std",[112,682,188],{"class":118},[112,684,685],{"class":122},"thread",[112,687,688],{"class":122}," t",[112,690,194],{"class":118},[112,692,693],{"class":122},"callable",[112,695,696],{"class":118},", ",[112,698,699],{"class":122},"arg1",[112,701,696],{"class":118},[112,703,704],{"class":122},"arg2",[112,706,707],{"class":118},", ...);\n",[12,709,710],{},"其中：",[26,712,713,719],{},[29,714,715,718],{},[81,716,717],{},"第一个参数","：要在线程中执行的可调用对象；",[29,720,721,724],{},[81,722,723],{},"后续参数","：传给这个可调用对象的实参。",[12,726,727],{},"可调用对象可以是：",[26,729,730,733,736,739],{},[29,731,732],{},"普通函数；",[29,734,735],{},"Lambda；",[29,737,738],{},"函数对象；",[29,740,741],{},"成员函数指针。",[12,743,744],{},"线程创建成功后，新线程会开始调用这个可调用对象。",[746,747,748],"h4",{"id":748},"普通函数",[92,750,752],{"className":106,"code":751,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nvoid print_sum(int a, int b)\n{\n    std::println(\"{}\", a + b);\n}\n\nint main()\n{\n    std::thread t(print_sum, 10, 20);\n    t.join();\n}\n",[15,753,754,760,766,770,795,799,820,824,828,836,840,862,871],{"__ignoreMap":98},[112,755,756,758],{"class":114,"line":115},[112,757,143],{"class":142},[112,759,147],{"class":146},[112,761,762,764],{"class":114,"line":150},[112,763,143],{"class":142},[112,765,155],{"class":146},[112,767,768],{"class":114,"line":158},[112,769,162],{"emptyLinePlaceholder":161},[112,771,772,774,777,779,781,785,787,789,792],{"class":114,"line":165},[112,773,168],{"class":142},[112,775,776],{"class":122}," print_sum",[112,778,194],{"class":118},[112,780,217],{"class":142},[112,782,784],{"class":783},"s4XuR"," a",[112,786,696],{"class":118},[112,788,217],{"class":142},[112,790,791],{"class":783}," b",[112,793,794],{"class":118},")\n",[112,796,797],{"class":114,"line":176},[112,798,179],{"class":118},[112,800,801,803,805,807,809,811,814,817],{"class":114,"line":182},[112,802,185],{"class":122},[112,804,188],{"class":118},[112,806,191],{"class":122},[112,808,194],{"class":118},[112,810,249],{"class":146},[112,812,813],{"class":118},", a ",[112,815,816],{"class":142},"+",[112,818,819],{"class":118}," b);\n",[112,821,822],{"class":114,"line":203},[112,823,206],{"class":118},[112,825,826],{"class":114,"line":209},[112,827,162],{"emptyLinePlaceholder":161},[112,829,830,832,834],{"class":114,"line":214},[112,831,217],{"class":142},[112,833,220],{"class":122},[112,835,126],{"class":118},[112,837,838],{"class":114,"line":225},[112,839,179],{"class":118},[112,841,842,844,846,849,852,855,857,860],{"class":114,"line":230},[112,843,185],{"class":122},[112,845,270],{"class":118},[112,847,848],{"class":122},"t",[112,850,851],{"class":118},"(print_sum, ",[112,853,854],{"class":386},"10",[112,856,696],{"class":118},[112,858,859],{"class":386},"20",[112,861,200],{"class":118},[112,863,864,867,869],{"class":114,"line":238},[112,865,866],{"class":118},"    t.",[112,868,310],{"class":122},[112,870,313],{"class":118},[112,872,873],{"class":114,"line":260},[112,874,206],{"class":118},[12,876,877],{},[81,878,342],{},[92,880,883],{"className":881,"code":882,"language":97,"meta":98},[95],"30\n",[15,884,882],{"__ignoreMap":98},[12,886,887],{},"这里：",[92,889,891],{"className":106,"code":890,"language":108,"meta":98,"style":98},"print_sum\n",[15,892,893],{"__ignoreMap":98},[112,894,895],{"class":114,"line":115},[112,896,890],{"class":118},[12,898,899],{},"是第一个参数，即线程函数；",[92,901,903],{"className":106,"code":902,"language":108,"meta":98,"style":98},"10, 20\n",[15,904,905],{"__ignoreMap":98},[112,906,907,909,911],{"class":114,"line":115},[112,908,854],{"class":386},[112,910,696],{"class":118},[112,912,913],{"class":386},"20\n",[12,915,916,917,920],{},"是传给 ",[15,918,919],{},"print_sum"," 的参数。",[746,922,924],{"id":923},"lambda","Lambda",[92,926,928],{"className":106,"code":927,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nint main()\n{\n    std::thread t([](int value) {\n        std::println(\"{}\", value);\n    }, 42);\n\n    t.join();\n}\n",[15,929,930,936,942,946,954,958,977,993,1003,1007,1015],{"__ignoreMap":98},[112,931,932,934],{"class":114,"line":115},[112,933,143],{"class":142},[112,935,147],{"class":146},[112,937,938,940],{"class":114,"line":150},[112,939,143],{"class":142},[112,941,155],{"class":146},[112,943,944],{"class":114,"line":158},[112,945,162],{"emptyLinePlaceholder":161},[112,947,948,950,952],{"class":114,"line":165},[112,949,217],{"class":142},[112,951,220],{"class":122},[112,953,126],{"class":118},[112,955,956],{"class":114,"line":176},[112,957,179],{"class":118},[112,959,960,962,964,966,969,971,974],{"class":114,"line":182},[112,961,185],{"class":122},[112,963,270],{"class":118},[112,965,848],{"class":122},[112,967,968],{"class":118},"([](",[112,970,217],{"class":142},[112,972,973],{"class":783}," value",[112,975,976],{"class":118},") {\n",[112,978,979,982,984,986,988,990],{"class":114,"line":203},[112,980,981],{"class":122},"        std",[112,983,188],{"class":118},[112,985,191],{"class":122},[112,987,194],{"class":118},[112,989,249],{"class":146},[112,991,992],{"class":118},", value);\n",[112,994,995,998,1001],{"class":114,"line":209},[112,996,997],{"class":118},"    }, ",[112,999,1000],{"class":386},"42",[112,1002,200],{"class":118},[112,1004,1005],{"class":114,"line":214},[112,1006,162],{"emptyLinePlaceholder":161},[112,1008,1009,1011,1013],{"class":114,"line":225},[112,1010,866],{"class":118},[112,1012,310],{"class":122},[112,1014,313],{"class":118},[112,1016,1017],{"class":114,"line":230},[112,1018,206],{"class":118},[12,1020,1021],{},[81,1022,342],{},[92,1024,1027],{"className":1025,"code":1026,"language":97,"meta":98},[95],"42\n",[15,1028,1026],{"__ignoreMap":98},[12,1030,1031,1032,1034],{},"Lambda 本身就是第一个可调用对象参数，",[15,1033,1000],{}," 是它的实参。",[746,1036,1037],{"id":1037},"函数对象",[92,1039,1041],{"className":106,"code":1040,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nstruct Worker\n{\n    void operator()(int value) const\n    {\n        std::println(\"{}\", value);\n    }\n};\n\nint main()\n{\n    std::thread t(Worker{}, 7);\n    t.join();\n}\n",[15,1042,1043,1049,1055,1059,1067,1071,1094,1099,1113,1118,1123,1127,1135,1139,1155,1163],{"__ignoreMap":98},[112,1044,1045,1047],{"class":114,"line":115},[112,1046,143],{"class":142},[112,1048,147],{"class":146},[112,1050,1051,1053],{"class":114,"line":150},[112,1052,143],{"class":142},[112,1054,155],{"class":146},[112,1056,1057],{"class":114,"line":158},[112,1058,162],{"emptyLinePlaceholder":161},[112,1060,1061,1064],{"class":114,"line":165},[112,1062,1063],{"class":142},"struct",[112,1065,1066],{"class":122}," Worker\n",[112,1068,1069],{"class":114,"line":176},[112,1070,179],{"class":118},[112,1072,1073,1076,1079,1082,1084,1086,1088,1091],{"class":114,"line":182},[112,1074,1075],{"class":142},"    void",[112,1077,1078],{"class":142}," operator",[112,1080,1081],{"class":122},"()",[112,1083,194],{"class":118},[112,1085,217],{"class":142},[112,1087,973],{"class":783},[112,1089,1090],{"class":118},") ",[112,1092,1093],{"class":142},"const\n",[112,1095,1096],{"class":114,"line":203},[112,1097,1098],{"class":118},"    {\n",[112,1100,1101,1103,1105,1107,1109,1111],{"class":114,"line":209},[112,1102,981],{"class":122},[112,1104,188],{"class":118},[112,1106,191],{"class":122},[112,1108,194],{"class":118},[112,1110,249],{"class":146},[112,1112,992],{"class":118},[112,1114,1115],{"class":114,"line":214},[112,1116,1117],{"class":118},"    }\n",[112,1119,1120],{"class":114,"line":225},[112,1121,1122],{"class":118},"};\n",[112,1124,1125],{"class":114,"line":230},[112,1126,162],{"emptyLinePlaceholder":161},[112,1128,1129,1131,1133],{"class":114,"line":238},[112,1130,217],{"class":142},[112,1132,220],{"class":122},[112,1134,126],{"class":118},[112,1136,1137],{"class":114,"line":260},[112,1138,179],{"class":118},[112,1140,1141,1143,1145,1147,1150,1153],{"class":114,"line":265},[112,1142,185],{"class":122},[112,1144,270],{"class":118},[112,1146,848],{"class":122},[112,1148,1149],{"class":118},"(Worker{}, ",[112,1151,1152],{"class":386},"7",[112,1154,200],{"class":118},[112,1156,1157,1159,1161],{"class":114,"line":279},[112,1158,866],{"class":118},[112,1160,310],{"class":122},[112,1162,313],{"class":118},[112,1164,1165],{"class":114,"line":299},[112,1166,206],{"class":118},[12,1168,1169],{},[81,1170,342],{},[92,1172,1175],{"className":1173,"code":1174,"language":97,"meta":98},[95],"7\n",[15,1176,1174],{"__ignoreMap":98},[746,1178,1179],{"id":1179},"成员函数",[12,1181,1182],{},"调用成员函数时，除了成员函数指针，还必须告诉线程“在哪个对象上调用”。",[92,1184,1186],{"className":106,"code":1185,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nclass Worker\n{\npublic:\n    void run(int value)\n    {\n        std::println(\"{}\", value);\n    }\n};\n\nint main()\n{\n    Worker worker;\n\n    std::thread t(&Worker::run, &worker, 100);\n    t.join();\n}\n",[15,1187,1188,1194,1200,1204,1211,1215,1220,1235,1239,1253,1257,1261,1265,1273,1277,1282,1286,1314,1322],{"__ignoreMap":98},[112,1189,1190,1192],{"class":114,"line":115},[112,1191,143],{"class":142},[112,1193,147],{"class":146},[112,1195,1196,1198],{"class":114,"line":150},[112,1197,143],{"class":142},[112,1199,155],{"class":146},[112,1201,1202],{"class":114,"line":158},[112,1203,162],{"emptyLinePlaceholder":161},[112,1205,1206,1209],{"class":114,"line":165},[112,1207,1208],{"class":142},"class",[112,1210,1066],{"class":122},[112,1212,1213],{"class":114,"line":176},[112,1214,179],{"class":118},[112,1216,1217],{"class":114,"line":182},[112,1218,1219],{"class":142},"public:\n",[112,1221,1222,1224,1227,1229,1231,1233],{"class":114,"line":203},[112,1223,1075],{"class":142},[112,1225,1226],{"class":122}," run",[112,1228,194],{"class":118},[112,1230,217],{"class":142},[112,1232,973],{"class":783},[112,1234,794],{"class":118},[112,1236,1237],{"class":114,"line":209},[112,1238,1098],{"class":118},[112,1240,1241,1243,1245,1247,1249,1251],{"class":114,"line":214},[112,1242,981],{"class":122},[112,1244,188],{"class":118},[112,1246,191],{"class":122},[112,1248,194],{"class":118},[112,1250,249],{"class":146},[112,1252,992],{"class":118},[112,1254,1255],{"class":114,"line":225},[112,1256,1117],{"class":118},[112,1258,1259],{"class":114,"line":230},[112,1260,1122],{"class":118},[112,1262,1263],{"class":114,"line":238},[112,1264,162],{"emptyLinePlaceholder":161},[112,1266,1267,1269,1271],{"class":114,"line":260},[112,1268,217],{"class":142},[112,1270,220],{"class":122},[112,1272,126],{"class":118},[112,1274,1275],{"class":114,"line":265},[112,1276,179],{"class":118},[112,1278,1279],{"class":114,"line":279},[112,1280,1281],{"class":118},"    Worker worker;\n",[112,1283,1284],{"class":114,"line":299},[112,1285,162],{"emptyLinePlaceholder":161},[112,1287,1288,1290,1292,1294,1296,1299,1302,1305,1307,1310,1312],{"class":114,"line":304},[112,1289,185],{"class":122},[112,1291,270],{"class":118},[112,1293,848],{"class":122},[112,1295,194],{"class":118},[112,1297,1298],{"class":142},"&",[112,1300,1301],{"class":122},"Worker",[112,1303,1304],{"class":118},"::run, ",[112,1306,1298],{"class":142},[112,1308,1309],{"class":118},"worker, ",[112,1311,559],{"class":386},[112,1313,200],{"class":118},[112,1315,1316,1318,1320],{"class":114,"line":316},[112,1317,866],{"class":118},[112,1319,310],{"class":122},[112,1321,313],{"class":118},[112,1323,1324],{"class":114,"line":335},[112,1325,206],{"class":118},[12,1327,1328],{},[81,1329,342],{},[92,1331,1334],{"className":1332,"code":1333,"language":97,"meta":98},[95],"100\n",[15,1335,1333],{"__ignoreMap":98},[12,1337,887],{},[92,1339,1341],{"className":106,"code":1340,"language":108,"meta":98,"style":98},"&Worker::run\n",[15,1342,1343],{"__ignoreMap":98},[112,1344,1345,1347,1349],{"class":114,"line":115},[112,1346,1298],{"class":142},[112,1348,1301],{"class":122},[112,1350,1351],{"class":118},"::run\n",[12,1353,1354],{},"是成员函数指针；",[92,1356,1358],{"className":106,"code":1357,"language":108,"meta":98,"style":98},"&worker\n",[15,1359,1360],{"__ignoreMap":98},[112,1361,1362,1364],{"class":114,"line":115},[112,1363,1298],{"class":142},[112,1365,1366],{"class":118},"worker\n",[12,1368,1369],{},"表示在哪个对象上调用；",[92,1371,1372],{"className":106,"code":1333,"language":108,"meta":98,"style":98},[15,1373,1374],{"__ignoreMap":98},[112,1375,1376],{"class":114,"line":115},[112,1377,1333],{"class":386},[12,1379,1380,1381,1384],{},"才是 ",[15,1382,1383],{},"run(int)"," 自己的参数。",[63,1386,1387],{"id":1387},"参数传递与生命周期",[68,1389,1390],{"id":1390},"线程参数默认会保存副本",[12,1392,1393,1394,1396],{},"这是 ",[15,1395,5],{}," 最容易让初学者误解的地方之一。",[12,1398,132],{},[92,1400,1402],{"className":106,"code":1401,"language":108,"meta":98,"style":98},"void foo(int value);\n\nint x = 10;\nstd::thread t(foo, x);\n",[15,1403,1404,1419,1423,1438],{"__ignoreMap":98},[112,1405,1406,1408,1411,1413,1415,1417],{"class":114,"line":115},[112,1407,168],{"class":142},[112,1409,1410],{"class":122}," foo",[112,1412,194],{"class":118},[112,1414,217],{"class":142},[112,1416,973],{"class":783},[112,1418,200],{"class":118},[112,1420,1421],{"class":114,"line":150},[112,1422,162],{"emptyLinePlaceholder":161},[112,1424,1425,1427,1430,1433,1436],{"class":114,"line":158},[112,1426,217],{"class":142},[112,1428,1429],{"class":118}," x ",[112,1431,1432],{"class":142},"=",[112,1434,1435],{"class":386}," 10",[112,1437,430],{"class":118},[112,1439,1440,1442,1444,1446,1448,1450,1453,1455,1458],{"class":114,"line":165},[112,1441,680],{"class":122},[112,1443,188],{"class":118},[112,1445,685],{"class":122},[112,1447,688],{"class":122},[112,1449,194],{"class":118},[112,1451,1452],{"class":122},"foo",[112,1454,696],{"class":118},[112,1456,1457],{"class":122},"x",[112,1459,200],{"class":118},[12,1461,1462,1463,1465],{},"线程并不是简单地“记住表达式 ",[15,1464,1457],{},"”。标准库会把传入参数经过衰减后保存进线程内部，再在新线程中调用。",[12,1467,1468],{},"因此很多情况下，线程拿到的是参数副本。",[746,1470,1471],{"id":1471},"按值传递",[92,1473,1475],{"className":106,"code":1474,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nvoid change(int value)\n{\n    value = 100;\n}\n\nint main()\n{\n    int x = 10;\n\n    std::thread t(change, x);\n    t.join();\n\n    std::println(\"{}\", x);\n}\n",[15,1476,1477,1483,1489,1493,1508,1512,1524,1528,1532,1540,1544,1557,1561,1572,1580,1584,1599],{"__ignoreMap":98},[112,1478,1479,1481],{"class":114,"line":115},[112,1480,143],{"class":142},[112,1482,147],{"class":146},[112,1484,1485,1487],{"class":114,"line":150},[112,1486,143],{"class":142},[112,1488,155],{"class":146},[112,1490,1491],{"class":114,"line":158},[112,1492,162],{"emptyLinePlaceholder":161},[112,1494,1495,1497,1500,1502,1504,1506],{"class":114,"line":165},[112,1496,168],{"class":142},[112,1498,1499],{"class":122}," change",[112,1501,194],{"class":118},[112,1503,217],{"class":142},[112,1505,973],{"class":783},[112,1507,794],{"class":118},[112,1509,1510],{"class":114,"line":176},[112,1511,179],{"class":118},[112,1513,1514,1517,1519,1522],{"class":114,"line":182},[112,1515,1516],{"class":118},"    value ",[112,1518,1432],{"class":142},[112,1520,1521],{"class":386}," 100",[112,1523,430],{"class":118},[112,1525,1526],{"class":114,"line":203},[112,1527,206],{"class":118},[112,1529,1530],{"class":114,"line":209},[112,1531,162],{"emptyLinePlaceholder":161},[112,1533,1534,1536,1538],{"class":114,"line":214},[112,1535,217],{"class":142},[112,1537,220],{"class":122},[112,1539,126],{"class":118},[112,1541,1542],{"class":114,"line":225},[112,1543,179],{"class":118},[112,1545,1546,1549,1551,1553,1555],{"class":114,"line":230},[112,1547,1548],{"class":142},"    int",[112,1550,1429],{"class":118},[112,1552,1432],{"class":142},[112,1554,1435],{"class":386},[112,1556,430],{"class":118},[112,1558,1559],{"class":114,"line":238},[112,1560,162],{"emptyLinePlaceholder":161},[112,1562,1563,1565,1567,1569],{"class":114,"line":260},[112,1564,185],{"class":122},[112,1566,270],{"class":118},[112,1568,848],{"class":122},[112,1570,1571],{"class":118},"(change, x);\n",[112,1573,1574,1576,1578],{"class":114,"line":265},[112,1575,866],{"class":118},[112,1577,310],{"class":122},[112,1579,313],{"class":118},[112,1581,1582],{"class":114,"line":279},[112,1583,162],{"emptyLinePlaceholder":161},[112,1585,1586,1588,1590,1592,1594,1596],{"class":114,"line":299},[112,1587,185],{"class":122},[112,1589,188],{"class":118},[112,1591,191],{"class":122},[112,1593,194],{"class":118},[112,1595,249],{"class":146},[112,1597,1598],{"class":118},", x);\n",[112,1600,1601],{"class":114,"line":304},[112,1602,206],{"class":118},[12,1604,1605],{},[81,1606,342],{},[92,1608,1611],{"className":1609,"code":1610,"language":97,"meta":98},[95],"10\n",[15,1612,1610],{"__ignoreMap":98},[12,1614,1615],{},"因为线程修改的是自己的参数副本。",[68,1617,1619,1622],{"id":1618},"stdref真正按引用传递",[15,1620,1621],{},"std::ref()","：真正按引用传递",[12,1624,1625],{},"如果线程函数要求：",[92,1627,1629],{"className":106,"code":1628,"language":108,"meta":98,"style":98},"void change(int& value);\n",[15,1630,1631],{"__ignoreMap":98},[112,1632,1633,1635,1637,1639,1642,1644],{"class":114,"line":115},[112,1634,168],{"class":142},[112,1636,1499],{"class":122},[112,1638,194],{"class":118},[112,1640,1641],{"class":142},"int&",[112,1643,973],{"class":783},[112,1645,200],{"class":118},[12,1647,1648],{},"并希望修改原对象，应使用：",[92,1650,1652],{"className":106,"code":1651,"language":108,"meta":98,"style":98},"std::ref(x)\n",[15,1653,1654],{"__ignoreMap":98},[112,1655,1656,1658,1660,1663],{"class":114,"line":115},[112,1657,680],{"class":122},[112,1659,188],{"class":118},[112,1661,1662],{"class":122},"ref",[112,1664,1665],{"class":118},"(x)\n",[12,1667,132],{},[92,1669,1671],{"className":106,"code":1670,"language":108,"meta":98,"style":98},"#include \u003Cfunctional>\n#include \u003Cprint>\n#include \u003Cthread>\n\nvoid change(int& value)\n{\n    value = 100;\n}\n\nint main()\n{\n    int x = 10;\n\n    std::thread t(change, std::ref(x));\n    t.join();\n\n    std::println(\"{}\", x);\n}\n",[15,1672,1673,1680,1686,1692,1696,1710,1714,1724,1728,1732,1740,1744,1756,1760,1780,1788,1792,1806],{"__ignoreMap":98},[112,1674,1675,1677],{"class":114,"line":115},[112,1676,143],{"class":142},[112,1678,1679],{"class":146}," \u003Cfunctional>\n",[112,1681,1682,1684],{"class":114,"line":150},[112,1683,143],{"class":142},[112,1685,147],{"class":146},[112,1687,1688,1690],{"class":114,"line":158},[112,1689,143],{"class":142},[112,1691,155],{"class":146},[112,1693,1694],{"class":114,"line":165},[112,1695,162],{"emptyLinePlaceholder":161},[112,1697,1698,1700,1702,1704,1706,1708],{"class":114,"line":176},[112,1699,168],{"class":142},[112,1701,1499],{"class":122},[112,1703,194],{"class":118},[112,1705,1641],{"class":142},[112,1707,973],{"class":783},[112,1709,794],{"class":118},[112,1711,1712],{"class":114,"line":182},[112,1713,179],{"class":118},[112,1715,1716,1718,1720,1722],{"class":114,"line":203},[112,1717,1516],{"class":118},[112,1719,1432],{"class":142},[112,1721,1521],{"class":386},[112,1723,430],{"class":118},[112,1725,1726],{"class":114,"line":209},[112,1727,206],{"class":118},[112,1729,1730],{"class":114,"line":214},[112,1731,162],{"emptyLinePlaceholder":161},[112,1733,1734,1736,1738],{"class":114,"line":225},[112,1735,217],{"class":142},[112,1737,220],{"class":122},[112,1739,126],{"class":118},[112,1741,1742],{"class":114,"line":230},[112,1743,179],{"class":118},[112,1745,1746,1748,1750,1752,1754],{"class":114,"line":238},[112,1747,1548],{"class":142},[112,1749,1429],{"class":118},[112,1751,1432],{"class":142},[112,1753,1435],{"class":386},[112,1755,430],{"class":118},[112,1757,1758],{"class":114,"line":260},[112,1759,162],{"emptyLinePlaceholder":161},[112,1761,1762,1764,1766,1768,1771,1773,1775,1777],{"class":114,"line":265},[112,1763,185],{"class":122},[112,1765,270],{"class":118},[112,1767,848],{"class":122},[112,1769,1770],{"class":118},"(change, ",[112,1772,680],{"class":122},[112,1774,188],{"class":118},[112,1776,1662],{"class":122},[112,1778,1779],{"class":118},"(x));\n",[112,1781,1782,1784,1786],{"class":114,"line":279},[112,1783,866],{"class":118},[112,1785,310],{"class":122},[112,1787,313],{"class":118},[112,1789,1790],{"class":114,"line":299},[112,1791,162],{"emptyLinePlaceholder":161},[112,1793,1794,1796,1798,1800,1802,1804],{"class":114,"line":304},[112,1795,185],{"class":122},[112,1797,188],{"class":118},[112,1799,191],{"class":122},[112,1801,194],{"class":118},[112,1803,249],{"class":146},[112,1805,1598],{"class":118},[112,1807,1808],{"class":114,"line":316},[112,1809,206],{"class":118},[12,1811,1812],{},[81,1813,342],{},[92,1815,1817],{"className":1816,"code":1333,"language":97,"meta":98},[95],[15,1818,1333],{"__ignoreMap":98},[12,1820,1821,1824],{},[15,1822,1823],{},"std::ref(x)"," 返回的是一个：",[92,1826,1828],{"className":106,"code":1827,"language":108,"meta":98,"style":98},"std::reference_wrapper\u003CT>\n",[15,1829,1830],{"__ignoreMap":98},[112,1831,1832,1834,1837,1840,1843],{"class":114,"line":115},[112,1833,680],{"class":122},[112,1835,1836],{"class":118},"::reference_wrapper",[112,1838,1839],{"class":142},"\u003C",[112,1841,1842],{"class":118},"T",[112,1844,1845],{"class":142},">\n",[12,1847,1848],{},"它本身可以被复制，但调用可调用对象时会还原为对原对象的引用。",[746,1850,1852],{"id":1851},"stdcref",[15,1853,1854],{},"std::cref()",[12,1856,1857,1858,1861],{},"如果需要按 ",[15,1859,1860],{},"const T&"," 传递，可以使用：",[92,1863,1865],{"className":106,"code":1864,"language":108,"meta":98,"style":98},"std::cref(x)\n",[15,1866,1867],{"__ignoreMap":98},[112,1868,1869,1871,1873,1876],{"class":114,"line":115},[112,1870,680],{"class":122},[112,1872,188],{"class":118},[112,1874,1875],{"class":122},"cref",[112,1877,1665],{"class":118},[12,1879,132],{},[92,1881,1883],{"className":106,"code":1882,"language":108,"meta":98,"style":98},"void print(const std::string& text);\n\nstd::string message = \"hello\";\nstd::thread t(print, std::cref(message));\n",[15,1884,1885,1911,1915,1929],{"__ignoreMap":98},[112,1886,1887,1889,1892,1894,1897,1899,1901,1904,1906,1909],{"class":114,"line":115},[112,1888,168],{"class":142},[112,1890,1891],{"class":122}," print",[112,1893,194],{"class":118},[112,1895,1896],{"class":142},"const",[112,1898,422],{"class":122},[112,1900,188],{"class":118},[112,1902,1903],{"class":122},"string",[112,1905,1298],{"class":142},[112,1907,1908],{"class":783}," text",[112,1910,200],{"class":118},[112,1912,1913],{"class":114,"line":150},[112,1914,162],{"emptyLinePlaceholder":161},[112,1916,1917,1919,1922,1924,1927],{"class":114,"line":158},[112,1918,680],{"class":122},[112,1920,1921],{"class":118},"::string message ",[112,1923,1432],{"class":142},[112,1925,1926],{"class":146}," \"hello\"",[112,1928,430],{"class":118},[112,1930,1931,1933,1935,1937,1939,1941,1944,1946,1948,1950,1952],{"class":114,"line":165},[112,1932,680],{"class":122},[112,1934,188],{"class":118},[112,1936,685],{"class":122},[112,1938,688],{"class":122},[112,1940,194],{"class":118},[112,1942,1943],{"class":122},"print",[112,1945,696],{"class":118},[112,1947,680],{"class":122},[112,1949,188],{"class":118},[112,1951,1875],{"class":122},[112,1953,1954],{"class":118},"(message));\n",[68,1956,1958,1960,1961,1964],{"id":1957},"stdrefx-和-x-完全不是一回事",[15,1959,1823],{}," 和 ",[15,1962,1963],{},"&x"," 完全不是一回事",[12,1966,1967],{},"这两个写法经常被混淆。",[92,1969,1970],{"className":106,"code":1651,"language":108,"meta":98,"style":98},[15,1971,1972],{"__ignoreMap":98},[112,1973,1974,1976,1978,1980],{"class":114,"line":115},[112,1975,680],{"class":122},[112,1977,188],{"class":118},[112,1979,1662],{"class":122},[112,1981,1665],{"class":118},[12,1983,1984],{},"表示“以引用语义传递原对象”。",[12,1986,1987],{},"而：",[92,1989,1991],{"className":106,"code":1990,"language":108,"meta":98,"style":98},"&x\n",[15,1992,1993],{"__ignoreMap":98},[112,1994,1995,1997],{"class":114,"line":115},[112,1996,1298],{"class":142},[112,1998,1999],{"class":118},"x\n",[12,2001,2002],{},"是取地址，类型是指针。",[12,2004,132],{},[92,2006,2008],{"className":106,"code":2007,"language":108,"meta":98,"style":98},"void f1(int& value);\nvoid f2(int* value);\n\nint x = 10;\n\nstd::thread t1(f1, std::ref(x));\nstd::thread t2(f2, &x);\n",[15,2009,2010,2025,2041,2045,2057,2061,2087],{"__ignoreMap":98},[112,2011,2012,2014,2017,2019,2021,2023],{"class":114,"line":115},[112,2013,168],{"class":142},[112,2015,2016],{"class":122}," f1",[112,2018,194],{"class":118},[112,2020,1641],{"class":142},[112,2022,973],{"class":783},[112,2024,200],{"class":118},[112,2026,2027,2029,2032,2034,2037,2039],{"class":114,"line":150},[112,2028,168],{"class":142},[112,2030,2031],{"class":122}," f2",[112,2033,194],{"class":118},[112,2035,2036],{"class":142},"int*",[112,2038,973],{"class":783},[112,2040,200],{"class":118},[112,2042,2043],{"class":114,"line":158},[112,2044,162],{"emptyLinePlaceholder":161},[112,2046,2047,2049,2051,2053,2055],{"class":114,"line":165},[112,2048,217],{"class":142},[112,2050,1429],{"class":118},[112,2052,1432],{"class":142},[112,2054,1435],{"class":386},[112,2056,430],{"class":118},[112,2058,2059],{"class":114,"line":176},[112,2060,162],{"emptyLinePlaceholder":161},[112,2062,2063,2065,2067,2069,2072,2074,2077,2079,2081,2083,2085],{"class":114,"line":182},[112,2064,680],{"class":122},[112,2066,188],{"class":118},[112,2068,685],{"class":122},[112,2070,2071],{"class":122}," t1",[112,2073,194],{"class":118},[112,2075,2076],{"class":122},"f1",[112,2078,696],{"class":118},[112,2080,680],{"class":122},[112,2082,188],{"class":118},[112,2084,1662],{"class":122},[112,2086,1779],{"class":118},[112,2088,2089,2091,2093,2095,2098,2100,2103,2105,2107,2109],{"class":114,"line":203},[112,2090,680],{"class":122},[112,2092,188],{"class":118},[112,2094,685],{"class":122},[112,2096,2097],{"class":122}," t2",[112,2099,194],{"class":118},[112,2101,2102],{"class":122},"f2",[112,2104,696],{"class":118},[112,2106,1298],{"class":142},[112,2108,1457],{"class":783},[112,2110,200],{"class":118},[12,2112,2113],{},"两者对应的是不同的形参类型。",[68,2115,2117],{"id":2116},"lambda-捕获也要注意值和引用","Lambda 捕获也要注意值和引用",[12,2119,2120],{},"线程和 Lambda 经常配合使用。",[12,2122,2123],{},"按值捕获：",[92,2125,2127],{"className":106,"code":2126,"language":108,"meta":98,"style":98},"int x = 10;\n\nstd::thread t([x] {\n    std::println(\"{}\", x);\n});\n",[15,2128,2129,2141,2145,2163,2177],{"__ignoreMap":98},[112,2130,2131,2133,2135,2137,2139],{"class":114,"line":115},[112,2132,217],{"class":142},[112,2134,1429],{"class":118},[112,2136,1432],{"class":142},[112,2138,1435],{"class":386},[112,2140,430],{"class":118},[112,2142,2143],{"class":114,"line":150},[112,2144,162],{"emptyLinePlaceholder":161},[112,2146,2147,2149,2151,2153,2155,2158,2160],{"class":114,"line":158},[112,2148,680],{"class":122},[112,2150,188],{"class":118},[112,2152,685],{"class":122},[112,2154,688],{"class":122},[112,2156,2157],{"class":118},"([",[112,2159,1457],{"class":783},[112,2161,2162],{"class":118},"] {\n",[112,2164,2165,2167,2169,2171,2173,2175],{"class":114,"line":165},[112,2166,185],{"class":122},[112,2168,188],{"class":118},[112,2170,191],{"class":122},[112,2172,194],{"class":118},[112,2174,249],{"class":146},[112,2176,1598],{"class":118},[112,2178,2179],{"class":114,"line":176},[112,2180,2181],{"class":118},"});\n",[12,2183,2184,2185,2187],{},"Lambda 内保存自己的 ",[15,2186,1457],{}," 副本。",[12,2189,2190],{},"按引用捕获：",[92,2192,2194],{"className":106,"code":2193,"language":108,"meta":98,"style":98},"int x = 10;\n\nstd::thread t([&x] {\n    x = 20;\n});\n\nt.join();\n",[15,2195,2196,2208,2212,2230,2242,2246,2250],{"__ignoreMap":98},[112,2197,2198,2200,2202,2204,2206],{"class":114,"line":115},[112,2199,217],{"class":142},[112,2201,1429],{"class":118},[112,2203,1432],{"class":142},[112,2205,1435],{"class":386},[112,2207,430],{"class":118},[112,2209,2210],{"class":114,"line":150},[112,2211,162],{"emptyLinePlaceholder":161},[112,2213,2214,2216,2218,2220,2222,2224,2226,2228],{"class":114,"line":158},[112,2215,680],{"class":122},[112,2217,188],{"class":118},[112,2219,685],{"class":122},[112,2221,688],{"class":122},[112,2223,2157],{"class":118},[112,2225,1298],{"class":142},[112,2227,1457],{"class":783},[112,2229,2162],{"class":118},[112,2231,2232,2235,2237,2240],{"class":114,"line":165},[112,2233,2234],{"class":118},"    x ",[112,2236,1432],{"class":142},[112,2238,2239],{"class":386}," 20",[112,2241,430],{"class":118},[112,2243,2244],{"class":114,"line":176},[112,2245,2181],{"class":118},[112,2247,2248],{"class":114,"line":182},[112,2249,162],{"emptyLinePlaceholder":161},[112,2251,2252,2255,2257],{"class":114,"line":203},[112,2253,2254],{"class":118},"t.",[112,2256,310],{"class":122},[112,2258,313],{"class":118},[12,2260,2261,2262,84],{},"线程直接访问外部的 ",[15,2263,1457],{},[12,2265,2266,2267,2269,2270,2272,2273,2275],{},"按引用捕获不会延长 ",[15,2268,1457],{}," 的生命周期，因此必须确保线程使用 ",[15,2271,1457],{}," 时，",[15,2274,1457],{}," 仍然存在。",[63,2277,2279],{"id":2278},"线程收尾与-joinable-状态","线程收尾与 joinable 状态",[68,2281,2283,2285],{"id":2282},"join等待线程结束",[15,2284,44],{},"：等待线程结束",[92,2287,2289],{"className":106,"code":2288,"language":108,"meta":98,"style":98},"t.join();\n",[15,2290,2291],{"__ignoreMap":98},[112,2292,2293,2295,2297],{"class":114,"line":115},[112,2294,2254],{"class":118},[112,2296,310],{"class":122},[112,2298,313],{"class":118},[12,2300,2301],{},"表示：",[2303,2304,2305],"blockquote",{},[12,2306,2307,2308,2310],{},"当前线程在这里阻塞，直到 ",[15,2309,848],{}," 所关联的线程执行结束。",[12,2312,132],{},[92,2314,2316],{"className":106,"code":2315,"language":108,"meta":98,"style":98},"#include \u003Cchrono>\n#include \u003Cprint>\n#include \u003Cthread>\n\nusing namespace std::chrono_literals;\n\nvoid work()\n{\n    std::this_thread::sleep_for(1s);\n    std::println(\"worker done\");\n}\n\nint main()\n{\n    std::thread t(work);\n\n    std::println(\"before join\");\n    t.join();\n    std::println(\"after join\");\n}\n",[15,2317,2318,2325,2331,2337,2341,2355,2359,2367,2371,2393,2408,2412,2416,2424,2428,2438,2442,2457,2465,2480],{"__ignoreMap":98},[112,2319,2320,2322],{"class":114,"line":115},[112,2321,143],{"class":142},[112,2323,2324],{"class":146}," \u003Cchrono>\n",[112,2326,2327,2329],{"class":114,"line":150},[112,2328,143],{"class":142},[112,2330,147],{"class":146},[112,2332,2333,2335],{"class":114,"line":158},[112,2334,143],{"class":142},[112,2336,155],{"class":146},[112,2338,2339],{"class":114,"line":165},[112,2340,162],{"emptyLinePlaceholder":161},[112,2342,2343,2345,2347,2349,2351,2353],{"class":114,"line":176},[112,2344,416],{"class":142},[112,2346,419],{"class":142},[112,2348,422],{"class":122},[112,2350,188],{"class":118},[112,2352,427],{"class":122},[112,2354,430],{"class":118},[112,2356,2357],{"class":114,"line":182},[112,2358,162],{"emptyLinePlaceholder":161},[112,2360,2361,2363,2365],{"class":114,"line":203},[112,2362,168],{"class":142},[112,2364,171],{"class":122},[112,2366,126],{"class":118},[112,2368,2369],{"class":114,"line":209},[112,2370,179],{"class":118},[112,2372,2373,2375,2377,2379,2381,2383,2385,2388,2391],{"class":114,"line":214},[112,2374,185],{"class":122},[112,2376,188],{"class":118},[112,2378,549],{"class":122},[112,2380,188],{"class":118},[112,2382,554],{"class":122},[112,2384,194],{"class":118},[112,2386,2387],{"class":386},"1",[112,2389,2390],{"class":142},"s",[112,2392,200],{"class":118},[112,2394,2395,2397,2399,2401,2403,2406],{"class":114,"line":225},[112,2396,185],{"class":122},[112,2398,188],{"class":118},[112,2400,191],{"class":122},[112,2402,194],{"class":118},[112,2404,2405],{"class":146},"\"worker done\"",[112,2407,200],{"class":118},[112,2409,2410],{"class":114,"line":230},[112,2411,206],{"class":118},[112,2413,2414],{"class":114,"line":238},[112,2415,162],{"emptyLinePlaceholder":161},[112,2417,2418,2420,2422],{"class":114,"line":260},[112,2419,217],{"class":142},[112,2421,220],{"class":122},[112,2423,126],{"class":118},[112,2425,2426],{"class":114,"line":265},[112,2427,179],{"class":118},[112,2429,2430,2432,2434,2436],{"class":114,"line":279},[112,2431,185],{"class":122},[112,2433,270],{"class":118},[112,2435,848],{"class":122},[112,2437,276],{"class":118},[112,2439,2440],{"class":114,"line":299},[112,2441,162],{"emptyLinePlaceholder":161},[112,2443,2444,2446,2448,2450,2452,2455],{"class":114,"line":304},[112,2445,185],{"class":122},[112,2447,188],{"class":118},[112,2449,191],{"class":122},[112,2451,194],{"class":118},[112,2453,2454],{"class":146},"\"before join\"",[112,2456,200],{"class":118},[112,2458,2459,2461,2463],{"class":114,"line":316},[112,2460,866],{"class":118},[112,2462,310],{"class":122},[112,2464,313],{"class":118},[112,2466,2467,2469,2471,2473,2475,2478],{"class":114,"line":335},[112,2468,185],{"class":122},[112,2470,188],{"class":118},[112,2472,191],{"class":122},[112,2474,194],{"class":118},[112,2476,2477],{"class":146},"\"after join\"",[112,2479,200],{"class":118},[112,2481,2482],{"class":114,"line":567},[112,2483,206],{"class":118},[12,2485,2486],{},[81,2487,342],{},[92,2489,2492],{"className":2490,"code":2491,"language":97,"meta":98},[95],"before join\nworker done\nafter join\n",[15,2493,2491],{"__ignoreMap":98},[12,2495,2496],{},"执行关系是：",[92,2498,2501],{"className":2499,"code":2500,"language":97,"meta":98},[95],"创建 t\n  ↓\nwork 与 main 并发执行\n  ↓\nmain 到达 join\n  ↓\n等待 work 结束\n  ↓\njoin 返回\n  ↓\nmain 继续执行\n",[15,2502,2500],{"__ignoreMap":98},[12,2504,2505],{},"调用成功后：",[92,2507,2509],{"className":106,"code":2508,"language":108,"meta":98,"style":98},"t.joinable() == false\n",[15,2510,2511],{"__ignoreMap":98},[112,2512,2513,2515,2517,2519,2521],{"class":114,"line":115},[112,2514,2254],{"class":118},[112,2516,123],{"class":122},[112,2518,380],{"class":118},[112,2520,383],{"class":142},[112,2522,2523],{"class":386}," false\n",[746,2525,2527,2529],{"id":2526},"join-不会自动延长任意对象生命周期",[15,2528,44],{}," 不会自动延长任意对象生命周期",[12,2531,2532,2534],{},[15,2533,44],{}," 只是在它被调用的位置等待目标线程。",[12,2536,2537],{},"下面是安全的：",[92,2539,2541],{"className":106,"code":2540,"language":108,"meta":98,"style":98},"int x = 10;\nstd::thread t([&x] {\n    ++x;\n});\n\nt.join();\n\u002F\u002F 到这里线程已经结束，而 x 还活着\n",[15,2542,2543,2555,2573,2581,2585,2589,2597],{"__ignoreMap":98},[112,2544,2545,2547,2549,2551,2553],{"class":114,"line":115},[112,2546,217],{"class":142},[112,2548,1429],{"class":118},[112,2550,1432],{"class":142},[112,2552,1435],{"class":386},[112,2554,430],{"class":118},[112,2556,2557,2559,2561,2563,2565,2567,2569,2571],{"class":114,"line":150},[112,2558,680],{"class":122},[112,2560,188],{"class":118},[112,2562,685],{"class":122},[112,2564,688],{"class":122},[112,2566,2157],{"class":118},[112,2568,1298],{"class":142},[112,2570,1457],{"class":783},[112,2572,2162],{"class":118},[112,2574,2575,2578],{"class":114,"line":158},[112,2576,2577],{"class":142},"    ++",[112,2579,2580],{"class":118},"x;\n",[112,2582,2583],{"class":114,"line":165},[112,2584,2181],{"class":118},[112,2586,2587],{"class":114,"line":176},[112,2588,162],{"emptyLinePlaceholder":161},[112,2590,2591,2593,2595],{"class":114,"line":182},[112,2592,2254],{"class":118},[112,2594,310],{"class":122},[112,2596,313],{"class":118},[112,2598,2599],{"class":114,"line":203},[112,2600,2602],{"class":2601},"sJ8bj","\u002F\u002F 到这里线程已经结束，而 x 还活着\n",[12,2604,2605],{},"但如果对象先离开作用域，再去等待线程，就已经太迟：",[92,2607,2609],{"className":106,"code":2608,"language":108,"meta":98,"style":98},"std::thread t;\n\n{\n    int x = 10;\n    t = std::thread([&x] {\n        \u002F\u002F 可能访问 x\n    });\n} \u002F\u002F x 在这里销毁\n\n\u002F\u002F 此时线程可能仍在访问已经销毁的 x\nt.join();\n",[15,2610,2611,2618,2622,2626,2638,2659,2664,2669,2677,2681,2686],{"__ignoreMap":98},[112,2612,2613,2615],{"class":114,"line":115},[112,2614,680],{"class":122},[112,2616,2617],{"class":118},"::thread t;\n",[112,2619,2620],{"class":114,"line":150},[112,2621,162],{"emptyLinePlaceholder":161},[112,2623,2624],{"class":114,"line":158},[112,2625,179],{"class":118},[112,2627,2628,2630,2632,2634,2636],{"class":114,"line":165},[112,2629,1548],{"class":142},[112,2631,1429],{"class":118},[112,2633,1432],{"class":142},[112,2635,1435],{"class":386},[112,2637,430],{"class":118},[112,2639,2640,2643,2645,2647,2649,2651,2653,2655,2657],{"class":114,"line":176},[112,2641,2642],{"class":118},"    t ",[112,2644,1432],{"class":142},[112,2646,422],{"class":122},[112,2648,188],{"class":118},[112,2650,685],{"class":122},[112,2652,2157],{"class":118},[112,2654,1298],{"class":142},[112,2656,1457],{"class":783},[112,2658,2162],{"class":118},[112,2660,2661],{"class":114,"line":182},[112,2662,2663],{"class":2601},"        \u002F\u002F 可能访问 x\n",[112,2665,2666],{"class":114,"line":203},[112,2667,2668],{"class":118},"    });\n",[112,2670,2671,2674],{"class":114,"line":209},[112,2672,2673],{"class":118},"}",[112,2675,2676],{"class":2601}," \u002F\u002F x 在这里销毁\n",[112,2678,2679],{"class":114,"line":214},[112,2680,162],{"emptyLinePlaceholder":161},[112,2682,2683],{"class":114,"line":225},[112,2684,2685],{"class":2601},"\u002F\u002F 此时线程可能仍在访问已经销毁的 x\n",[112,2687,2688,2690,2692],{"class":114,"line":230},[112,2689,2254],{"class":118},[112,2691,310],{"class":122},[112,2693,313],{"class":118},[68,2695,2697,2699],{"id":2696},"detach线程脱离管理",[15,2698,48],{},"：线程脱离管理",[92,2701,2703],{"className":106,"code":2702,"language":108,"meta":98,"style":98},"t.detach();\n",[15,2704,2705],{"__ignoreMap":98},[112,2706,2707,2709,2712],{"class":114,"line":115},[112,2708,2254],{"class":118},[112,2710,2711],{"class":122},"detach",[112,2713,313],{"class":118},[12,2715,2716,2717,2719,2720,2722],{},"官方定义：调用 ",[15,2718,48],{}," 后，线程会继续独立运行，而当前 ",[15,2721,5],{}," 对象不再与该线程关联。",[12,2724,2725,2726,2728,2729,2731,2732,2734,2735,2737,2738,2740],{},"为了方便理解，也可以“民办”地理解成：\n",[15,2727,48],{}," 一调用，当前线程对象就会立刻变成不可 ",[15,2730,51],{},"；\n它有点像一个“不会阻塞的 ",[15,2733,44],{},"”——区别在于，",[15,2736,44],{}," 会等待线程执行结束后再返回，而 ",[15,2739,48],{}," 不会等待，调用后立即返回，让线程自己在后台继续运行。",[12,2742,2743],{},"因此：",[92,2745,2746],{"className":106,"code":2508,"language":108,"meta":98,"style":98},[15,2747,2748],{"__ignoreMap":98},[112,2749,2750,2752,2754,2756,2758],{"class":114,"line":115},[112,2751,2254],{"class":118},[112,2753,123],{"class":122},[112,2755,380],{"class":118},[112,2757,383],{"class":142},[112,2759,2523],{"class":386},[12,2761,2762,2764],{},[15,2763,48],{}," 最大的问题是生命周期很难管理。",[12,2766,2767],{},"错误示例：",[92,2769,2771],{"className":106,"code":2770,"language":108,"meta":98,"style":98},"void start()\n{\n    int value = 42;\n\n    std::thread t([&value] {\n        std::println(\"{}\", value);\n    });\n\n    t.detach();\n} \u002F\u002F value 已经销毁，但脱离线程可能仍在使用它\n",[15,2772,2773,2782,2786,2800,2804,2821,2835,2839,2843,2851],{"__ignoreMap":98},[112,2774,2775,2777,2780],{"class":114,"line":115},[112,2776,168],{"class":142},[112,2778,2779],{"class":122}," start",[112,2781,126],{"class":118},[112,2783,2784],{"class":114,"line":150},[112,2785,179],{"class":118},[112,2787,2788,2790,2793,2795,2798],{"class":114,"line":158},[112,2789,1548],{"class":142},[112,2791,2792],{"class":118}," value ",[112,2794,1432],{"class":142},[112,2796,2797],{"class":386}," 42",[112,2799,430],{"class":118},[112,2801,2802],{"class":114,"line":165},[112,2803,162],{"emptyLinePlaceholder":161},[112,2805,2806,2808,2810,2812,2814,2816,2819],{"class":114,"line":176},[112,2807,185],{"class":122},[112,2809,270],{"class":118},[112,2811,848],{"class":122},[112,2813,2157],{"class":118},[112,2815,1298],{"class":142},[112,2817,2818],{"class":783},"value",[112,2820,2162],{"class":118},[112,2822,2823,2825,2827,2829,2831,2833],{"class":114,"line":182},[112,2824,981],{"class":122},[112,2826,188],{"class":118},[112,2828,191],{"class":122},[112,2830,194],{"class":118},[112,2832,249],{"class":146},[112,2834,992],{"class":118},[112,2836,2837],{"class":114,"line":203},[112,2838,2668],{"class":118},[112,2840,2841],{"class":114,"line":209},[112,2842,162],{"emptyLinePlaceholder":161},[112,2844,2845,2847,2849],{"class":114,"line":214},[112,2846,866],{"class":118},[112,2848,2711],{"class":122},[112,2850,313],{"class":118},[112,2852,2853,2855],{"class":114,"line":225},[112,2854,2673],{"class":118},[112,2856,2857],{"class":2601}," \u002F\u002F value 已经销毁，但脱离线程可能仍在使用它\n",[12,2859,2860],{},"这会产生悬空引用和未定义行为。",[12,2862,2863,2864,2866,2867,84],{},"初学和普通工程代码中，优先考虑明确 ",[15,2865,44],{},"，不要为了“让线程后台跑”就习惯性 ",[15,2868,48],{},[68,2870,2872,2874],{"id":2871},"joinable判断能否-join",[15,2873,51],{},"：判断能否 join",[92,2876,2878],{"className":106,"code":2877,"language":108,"meta":98,"style":98},"if (t.joinable())\n{\n    t.join();\n}\n",[15,2879,2880,2893,2897,2905],{"__ignoreMap":98},[112,2881,2882,2885,2888,2890],{"class":114,"line":115},[112,2883,2884],{"class":142},"if",[112,2886,2887],{"class":118}," (t.",[112,2889,123],{"class":122},[112,2891,2892],{"class":118},"())\n",[112,2894,2895],{"class":114,"line":150},[112,2896,179],{"class":118},[112,2898,2899,2901,2903],{"class":114,"line":158},[112,2900,866],{"class":118},[112,2902,310],{"class":122},[112,2904,313],{"class":118},[112,2906,2907],{"class":114,"line":165},[112,2908,206],{"class":118},[12,2910,2911],{},"常见状态变化：",[2913,2914,2915,2931],"table",{},[2916,2917,2918],"thead",{},[2919,2920,2921,2926],"tr",{},[2922,2923,2925],"th",{"align":2924},"left","操作",[2922,2927,2929],{"align":2928},"center",[15,2930,51],{},[2932,2933,2934,2947,2958,2967,2979,2989],"tbody",{},[2919,2935,2936,2943],{},[2937,2938,2939,2940],"td",{"align":2924},"默认构造 ",[15,2941,2942],{},"std::thread t;",[2937,2944,2945],{"align":2928},[15,2946,655],{},[2919,2948,2949,2954],{},[2937,2950,2951],{"align":2924},[15,2952,2953],{},"std::thread t(f);",[2937,2955,2956],{"align":2928},[15,2957,640],{},[2919,2959,2960,2963],{},[2937,2961,2962],{"align":2924},"线程函数已经执行完，但尚未 join\u002Fdetach",[2937,2964,2965],{"align":2928},[15,2966,640],{},[2919,2968,2969,2975],{},[2937,2970,2971,2972,2974],{"align":2924},"调用 ",[15,2973,44],{}," 后",[2937,2976,2977],{"align":2928},[15,2978,655],{},[2919,2980,2981,2985],{},[2937,2982,2971,2983,2974],{"align":2924},[15,2984,48],{},[2937,2986,2987],{"align":2928},[15,2988,655],{},[2919,2990,2991,2994],{},[2937,2992,2993],{"align":2924},"被 move-from 的 thread",[2937,2995,2996],{"align":2928},[15,2997,655],{},[68,2999,3001],{"id":3000},"为什么忘记-joindetach-会直接终止程序","为什么忘记 join\u002Fdetach 会直接终止程序？",[12,3003,3004,3005,3007],{},"如果一个 ",[15,3006,5],{}," 对象析构时仍满足：",[92,3009,3011],{"className":106,"code":3010,"language":108,"meta":98,"style":98},"t.joinable() == true\n",[15,3012,3013],{"__ignoreMap":98},[112,3014,3015,3017,3019,3021,3023],{"class":114,"line":115},[112,3016,2254],{"class":118},[112,3018,123],{"class":122},[112,3020,380],{"class":118},[112,3022,383],{"class":142},[112,3024,387],{"class":386},[12,3026,3027],{},"程序会调用：",[92,3029,3031],{"className":106,"code":3030,"language":108,"meta":98,"style":98},"std::terminate()\n",[15,3032,3033],{"__ignoreMap":98},[112,3034,3035,3037,3039,3042],{"class":114,"line":115},[112,3036,680],{"class":122},[112,3038,188],{"class":118},[112,3040,3041],{"class":122},"terminate",[112,3043,126],{"class":118},[12,3045,3046,3047,3050],{},"这个",[15,3048,3049],{},"std::terminate()","会立刻终止整个程序。它不是“结束当前线程”，而是整个进程直接进入异常终止流程。",[12,3052,132],{},[92,3054,3056],{"className":106,"code":3055,"language":108,"meta":98,"style":98},"#include \u003Cthread>\n\nvoid work()\n{\n}\n\nint main()\n{\n    std::thread t(work);\n} \u002F\u002F 错误：t 析构时仍然 joinable\n",[15,3057,3058,3064,3068,3076,3080,3084,3088,3096,3100,3110],{"__ignoreMap":98},[112,3059,3060,3062],{"class":114,"line":115},[112,3061,143],{"class":142},[112,3063,155],{"class":146},[112,3065,3066],{"class":114,"line":150},[112,3067,162],{"emptyLinePlaceholder":161},[112,3069,3070,3072,3074],{"class":114,"line":158},[112,3071,168],{"class":142},[112,3073,171],{"class":122},[112,3075,126],{"class":118},[112,3077,3078],{"class":114,"line":165},[112,3079,179],{"class":118},[112,3081,3082],{"class":114,"line":176},[112,3083,206],{"class":118},[112,3085,3086],{"class":114,"line":182},[112,3087,162],{"emptyLinePlaceholder":161},[112,3089,3090,3092,3094],{"class":114,"line":203},[112,3091,217],{"class":142},[112,3093,220],{"class":122},[112,3095,126],{"class":118},[112,3097,3098],{"class":114,"line":209},[112,3099,179],{"class":118},[112,3101,3102,3104,3106,3108],{"class":114,"line":214},[112,3103,185],{"class":122},[112,3105,270],{"class":118},[112,3107,848],{"class":122},[112,3109,276],{"class":118},[112,3111,3112,3114],{"class":114,"line":225},[112,3113,2673],{"class":118},[112,3115,3116],{"class":2601}," \u002F\u002F 错误：t 析构时仍然 joinable\n",[12,3118,3119,3121,3122,3124,3125,3127,3128,3130],{},[81,3120,342],{}," 程序会因为 ",[15,3123,5],{}," 对象析构时仍然 ",[15,3126,51],{}," 而调用 ",[15,3129,3049],{},"，示例输出类似：",[92,3132,3135],{"className":3133,"code":3134,"language":97,"meta":98},[95],"terminate called without an active exception\n",[15,3136,3134],{"__ignoreMap":98},[12,3138,3139],{},"可以把规则概念化成：",[92,3141,3143],{"className":106,"code":3142,"language":108,"meta":98,"style":98},"~thread()\n{\n    if (joinable())\n    {\n        std::terminate();\n    }\n}\n",[15,3144,3145,3154,3158,3170,3174,3184,3188],{"__ignoreMap":98},[112,3146,3147,3150,3152],{"class":114,"line":115},[112,3148,3149],{"class":142},"~",[112,3151,685],{"class":122},[112,3153,126],{"class":118},[112,3155,3156],{"class":114,"line":150},[112,3157,179],{"class":118},[112,3159,3160,3163,3166,3168],{"class":114,"line":158},[112,3161,3162],{"class":142},"    if",[112,3164,3165],{"class":118}," (",[112,3167,123],{"class":122},[112,3169,2892],{"class":118},[112,3171,3172],{"class":114,"line":165},[112,3173,1098],{"class":118},[112,3175,3176,3178,3180,3182],{"class":114,"line":176},[112,3177,981],{"class":122},[112,3179,188],{"class":118},[112,3181,3041],{"class":122},[112,3183,313],{"class":118},[112,3185,3186],{"class":114,"line":182},[112,3187,1117],{"class":118},[112,3189,3190],{"class":114,"line":203},[112,3191,206],{"class":118},[12,3193,3194],{},"这不是标准库源码，只是帮助理解析构语义。",[12,3196,3197,3198,3200,3201,3203],{},"标准库不会偷偷帮你自动 ",[15,3199,44],{},"，因为自动等待可能让程序在一个意料之外的位置长时间阻塞；也不会偷偷 ",[15,3202,48],{},"，因为那可能制造更严重的生命周期错误。",[63,3205,3206],{"id":3206},"管理权与线程工具",[68,3208,3210,3212],{"id":3209},"stdthread-不可复制但可以移动",[15,3211,5],{}," 不可复制，但可以移动",[12,3214,3215,3216,3218],{},"线程的管理权不能被两个 ",[15,3217,5],{}," 对象同时拥有，因此它不可复制：",[92,3220,3222],{"className":106,"code":3221,"language":108,"meta":98,"style":98},"std::thread t1(work);\n\n\u002F\u002F std::thread t2 = t1; \u002F\u002F 编译错误\n",[15,3223,3224,3241,3245],{"__ignoreMap":98},[112,3225,3226,3228,3230,3232,3234,3236,3239],{"class":114,"line":115},[112,3227,680],{"class":122},[112,3229,188],{"class":118},[112,3231,685],{"class":122},[112,3233,2071],{"class":122},[112,3235,194],{"class":118},[112,3237,3238],{"class":122},"work",[112,3240,200],{"class":118},[112,3242,3243],{"class":114,"line":150},[112,3244,162],{"emptyLinePlaceholder":161},[112,3246,3247,3250],{"class":114,"line":158},[112,3248,3249],{"class":2601},"\u002F\u002F std::thread t2 = t1;",[112,3251,3252],{"class":2601}," \u002F\u002F 编译错误\n",[12,3254,3255],{},"但可以转移所有权：",[92,3257,3259],{"className":106,"code":3258,"language":108,"meta":98,"style":98},"std::thread t1(work);\nstd::thread t2 = std::move(t1);\n",[15,3260,3261,3277],{"__ignoreMap":98},[112,3262,3263,3265,3267,3269,3271,3273,3275],{"class":114,"line":115},[112,3264,680],{"class":122},[112,3266,188],{"class":118},[112,3268,685],{"class":122},[112,3270,2071],{"class":122},[112,3272,194],{"class":118},[112,3274,3238],{"class":122},[112,3276,200],{"class":118},[112,3278,3279,3281,3284,3286,3288,3290,3293],{"class":114,"line":150},[112,3280,680],{"class":122},[112,3282,3283],{"class":118},"::thread t2 ",[112,3285,1432],{"class":142},[112,3287,422],{"class":122},[112,3289,188],{"class":118},[112,3291,3292],{"class":122},"move",[112,3294,3295],{"class":118},"(t1);\n",[12,3297,3298],{},"移动后：",[92,3300,3303],{"className":3301,"code":3302,"language":97,"meta":98},[95],"t1.joinable() == false\nt2.joinable() == true\n",[15,3304,3302],{"__ignoreMap":98},[12,3306,3307,3308,3310,3311,363,3313,84],{},"最后应该由 ",[15,3309,273],{}," 负责 ",[15,3312,44],{},[15,3314,48],{},[12,3316,3317,3318,3321],{},"这也是为什么 ",[15,3319,3320],{},"std::vector\u003Cstd::thread>"," 可以工作：容器通过移动而不是复制管理线程对象。",[68,3323,3325],{"id":3324},"stdthis_thread",[15,3326,3327],{},"std::this_thread",[12,3329,3330,3332,3333,3335],{},[15,3331,3327],{}," 提供“操作当前线程”的工具。但他不是只能在",[15,3334,5],{},"的对象内使用。",[746,3337,3339],{"id":3338},"获取线程-id","获取线程 ID",[92,3341,3343],{"className":106,"code":3342,"language":108,"meta":98,"style":98},"std::this_thread::get_id()\n",[15,3344,3345],{"__ignoreMap":98},[112,3346,3347,3349,3351,3353,3355,3358],{"class":114,"line":115},[112,3348,680],{"class":122},[112,3350,188],{"class":118},[112,3352,549],{"class":122},[112,3354,188],{"class":118},[112,3356,3357],{"class":122},"get_id",[112,3359,126],{"class":118},[12,3361,3362],{},"示例：",[92,3364,3366],{"className":106,"code":3365,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nint main()\n{\n    std::println(\"{}\", std::this_thread::get_id());\n}\n",[15,3367,3368,3374,3380,3384,3392,3396,3422],{"__ignoreMap":98},[112,3369,3370,3372],{"class":114,"line":115},[112,3371,143],{"class":142},[112,3373,147],{"class":146},[112,3375,3376,3378],{"class":114,"line":150},[112,3377,143],{"class":142},[112,3379,155],{"class":146},[112,3381,3382],{"class":114,"line":158},[112,3383,162],{"emptyLinePlaceholder":161},[112,3385,3386,3388,3390],{"class":114,"line":165},[112,3387,217],{"class":142},[112,3389,220],{"class":122},[112,3391,126],{"class":118},[112,3393,3394],{"class":114,"line":176},[112,3395,179],{"class":118},[112,3397,3398,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420],{"class":114,"line":182},[112,3399,185],{"class":122},[112,3401,188],{"class":118},[112,3403,191],{"class":122},[112,3405,194],{"class":118},[112,3407,249],{"class":146},[112,3409,696],{"class":118},[112,3411,680],{"class":122},[112,3413,188],{"class":118},[112,3415,549],{"class":122},[112,3417,188],{"class":118},[112,3419,3357],{"class":122},[112,3421,257],{"class":118},[112,3423,3424],{"class":114,"line":203},[112,3425,206],{"class":118},[12,3427,3428],{},[81,3429,3430],{},"运行结果示例（线程 ID 每次运行可能不同）：",[92,3432,3435],{"className":3433,"code":3434,"language":97,"meta":98},[95],"139779631826496\n",[15,3436,3434],{"__ignoreMap":98},[746,3438,3439],{"id":3439},"休眠",[92,3441,3443],{"className":106,"code":3442,"language":108,"meta":98,"style":98},"std::this_thread::sleep_for(...)\nstd::this_thread::sleep_until(...)\n",[15,3444,3445,3460],{"__ignoreMap":98},[112,3446,3447,3449,3451,3453,3455,3457],{"class":114,"line":115},[112,3448,680],{"class":122},[112,3450,188],{"class":118},[112,3452,549],{"class":122},[112,3454,188],{"class":118},[112,3456,554],{"class":122},[112,3458,3459],{"class":118},"(...)\n",[112,3461,3462,3464,3466,3468,3470,3473],{"class":114,"line":150},[112,3463,680],{"class":122},[112,3465,188],{"class":118},[112,3467,549],{"class":122},[112,3469,188],{"class":118},[112,3471,3472],{"class":122},"sleep_until",[112,3474,3459],{"class":118},[2913,3476,3477,3490],{},[2916,3478,3479],{},[2919,3480,3481,3484,3487],{},[2922,3482,3483],{},"函数",[2922,3485,3486],{},"参数",[2922,3488,3489],{},"含义",[2932,3491,3492,3505],{},[2919,3493,3494,3499,3502],{},[2937,3495,3496],{},[15,3497,3498],{},"sleep_for(duration)",[2937,3500,3501],{},"时间长度",[2937,3503,3504],{},"再睡多久",[2919,3506,3507,3512,3515],{},[2937,3508,3509],{},[15,3510,3511],{},"sleep_until(time_point)",[2937,3513,3514],{},"时间点",[2937,3516,3517],{},"睡到什么时候",[12,3519,132],{},[92,3521,3523],{"className":106,"code":3522,"language":108,"meta":98,"style":98},"\u002F\u002F睡100ms\nstd::this_thread::sleep_for(std::chrono::milliseconds(100));\n",[15,3524,3525,3530],{"__ignoreMap":98},[112,3526,3527],{"class":114,"line":115},[112,3528,3529],{"class":2601},"\u002F\u002F睡100ms\n",[112,3531,3532,3534,3536,3538,3540,3542,3544,3546,3548,3551,3553,3556,3558,3560],{"class":114,"line":150},[112,3533,680],{"class":122},[112,3535,188],{"class":118},[112,3537,549],{"class":122},[112,3539,188],{"class":118},[112,3541,554],{"class":122},[112,3543,194],{"class":118},[112,3545,680],{"class":122},[112,3547,188],{"class":118},[112,3549,3550],{"class":122},"chrono",[112,3552,188],{"class":118},[112,3554,3555],{"class":122},"milliseconds",[112,3557,194],{"class":118},[112,3559,559],{"class":386},[112,3561,3562],{"class":118},"));\n",[92,3564,3566],{"className":106,"code":3565,"language":108,"meta":98,"style":98},"\u002F\u002F到相对于now()之后的100ms\nauto next = std::chrono::steady_clock::now();\nnext += 100ms;\nstd::this_thread::sleep_until(next);\n",[15,3567,3568,3573,3601,3615],{"__ignoreMap":98},[112,3569,3570],{"class":114,"line":115},[112,3571,3572],{"class":2601},"\u002F\u002F到相对于now()之后的100ms\n",[112,3574,3575,3578,3581,3583,3585,3587,3589,3591,3594,3596,3599],{"class":114,"line":150},[112,3576,3577],{"class":142},"auto",[112,3579,3580],{"class":118}," next ",[112,3582,1432],{"class":142},[112,3584,422],{"class":122},[112,3586,188],{"class":118},[112,3588,3550],{"class":122},[112,3590,188],{"class":118},[112,3592,3593],{"class":122},"steady_clock",[112,3595,188],{"class":118},[112,3597,3598],{"class":122},"now",[112,3600,313],{"class":118},[112,3602,3603,3606,3609,3611,3613],{"class":114,"line":158},[112,3604,3605],{"class":118},"next ",[112,3607,3608],{"class":142},"+=",[112,3610,1521],{"class":386},[112,3612,562],{"class":142},[112,3614,430],{"class":118},[112,3616,3617,3619,3621,3623,3625,3627],{"class":114,"line":165},[112,3618,680],{"class":122},[112,3620,188],{"class":118},[112,3622,549],{"class":122},[112,3624,188],{"class":118},[112,3626,3472],{"class":122},[112,3628,3629],{"class":118},"(next);\n",[746,3631,3632],{"id":3632},"主动让出执行机会",[92,3634,3636],{"className":106,"code":3635,"language":108,"meta":98,"style":98},"std::this_thread::yield();\n",[15,3637,3638],{"__ignoreMap":98},[112,3639,3640,3642,3644,3646,3648,3651],{"class":114,"line":115},[112,3641,680],{"class":122},[112,3643,188],{"class":118},[112,3645,549],{"class":122},[112,3647,188],{"class":118},[112,3649,3650],{"class":122},"yield",[112,3652,313],{"class":118},[12,3654,3655],{},"它只是向调度器提示“当前线程愿意暂时让出执行机会”，并不保证另一个指定线程一定马上运行，也不保证下一个运行的线程不是自己。",[12,3657,3658,3659,3662],{},"比较形象一点的说法：当前线程主动告诉操作系统调度器：“我现在可以先让一下 CPU，你可以考虑让别的线程先运行。”\n",[15,3660,3661],{},"yield()"," 只是“主动让出这次 CPU 调度机会”，但马上又被调度回来也是完全可能的。",[12,3664,390],{},[92,3666,3668],{"className":106,"code":3667,"language":108,"meta":98,"style":98},"while (!ready) \n{\n    std::this_thread::yield();\n}\n",[15,3669,3670,3683,3687,3701],{"__ignoreMap":98},[112,3671,3672,3675,3677,3680],{"class":114,"line":115},[112,3673,3674],{"class":142},"while",[112,3676,3165],{"class":118},[112,3678,3679],{"class":142},"!",[112,3681,3682],{"class":118},"ready) \n",[112,3684,3685],{"class":114,"line":150},[112,3686,179],{"class":118},[112,3688,3689,3691,3693,3695,3697,3699],{"class":114,"line":158},[112,3690,185],{"class":122},[112,3692,188],{"class":118},[112,3694,549],{"class":122},[112,3696,188],{"class":118},[112,3698,3650],{"class":122},[112,3700,313],{"class":118},[112,3702,3703],{"class":114,"line":165},[112,3704,206],{"class":118},[12,3706,3707,3708,3711,3712,3714],{},"这种比",[15,3709,3710],{},"while (!ready) {}","这种空转要好很多，因为空转会一直霸占 CPU，而 ",[15,3713,3661],{}," 会给其他线程更多运行机会。",[68,3716,3718],{"id":3717},"hardware_concurrency",[15,3719,3720],{},"hardware_concurrency()",[92,3722,3724],{"className":106,"code":3723,"language":108,"meta":98,"style":98},"std::thread::hardware_concurrency()\n",[15,3725,3726],{"__ignoreMap":98},[112,3727,3728,3730,3732,3734,3736,3738],{"class":114,"line":115},[112,3729,680],{"class":122},[112,3731,188],{"class":118},[112,3733,685],{"class":122},[112,3735,188],{"class":118},[112,3737,3717],{"class":122},[112,3739,126],{"class":118},[12,3741,3742],{},"一般用来查询：当前系统大概支持多少个线程可以并行执行。一般是CPU 的逻辑核心数 \u002F 硬件线程数。",[92,3744,3746],{"className":106,"code":3745,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nint main()\n{\n    std::println(\"建议并发线程数：{}\", std::thread::hardware_concurrency());\n}\n",[15,3747,3748,3754,3760,3764,3772,3776,3803],{"__ignoreMap":98},[112,3749,3750,3752],{"class":114,"line":115},[112,3751,143],{"class":142},[112,3753,147],{"class":146},[112,3755,3756,3758],{"class":114,"line":150},[112,3757,143],{"class":142},[112,3759,155],{"class":146},[112,3761,3762],{"class":114,"line":158},[112,3763,162],{"emptyLinePlaceholder":161},[112,3765,3766,3768,3770],{"class":114,"line":165},[112,3767,217],{"class":142},[112,3769,220],{"class":122},[112,3771,126],{"class":118},[112,3773,3774],{"class":114,"line":176},[112,3775,179],{"class":118},[112,3777,3778,3780,3782,3784,3786,3789,3791,3793,3795,3797,3799,3801],{"class":114,"line":182},[112,3779,185],{"class":122},[112,3781,188],{"class":118},[112,3783,191],{"class":122},[112,3785,194],{"class":118},[112,3787,3788],{"class":146},"\"建议并发线程数：{}\"",[112,3790,696],{"class":118},[112,3792,680],{"class":122},[112,3794,188],{"class":118},[112,3796,685],{"class":122},[112,3798,188],{"class":118},[112,3800,3717],{"class":122},[112,3802,257],{"class":118},[112,3804,3805],{"class":114,"line":203},[112,3806,206],{"class":118},[12,3808,3809],{},[81,3810,3811],{},"运行结果示例（数值取决于当前机器）：",[92,3813,3816],{"className":3814,"code":3815,"language":97,"meta":98},[95],"建议并发线程数：16\n",[15,3817,3815],{"__ignoreMap":98},[12,3819,3820,3821,3824,3825,3828,3829,84],{},"假设你的 CPU 是 ",[15,3822,3823],{},"8 核 16 线程","，那么 ",[15,3826,3827],{},"std::thread::hardware_concurrency()"," 通常会返回 ",[15,3830,3831],{},"16",[12,3833,3834,3835,3838],{},"但这并不意味着程序最多只能创建 16 个线程。它表示的是当前硬件大约能够支持多少个线程",[81,3836,3837],{},"真正","并行执行，也就是硬件并发能力的参考值。\n即使只有 16 个逻辑处理器，只要系统资源允许，依然可以创建几十个甚至上百个线程。",[12,3840,3841],{},"当线程数量超过硬件能够真正并行执行的数量时，操作系统会通过时间片轮转、线程调度等机制，让这些线程交替获得 CPU 执行时间，从宏观上看起来像是在“同时运行”。虽然这不是真正意义上的完全并行，但在很多场景下，从程序运行效果上看和真正并发并没有特别明显的区别。（类似STM32上使用的FreeRTOS，用1个CPU内核来模拟多线程）",[12,3843,3844,3845,3848],{},"另外，如果函数返回 ",[15,3846,3847],{},"0","，表示当前实现无法提供硬件并发信息，因此不能把这个返回值当作绝对可靠的固定值。",[68,3850,3851],{"id":3851},"多线程输出顺序是不确定的",[92,3853,3855],{"className":106,"code":3854,"language":108,"meta":98,"style":98},"#include \u003Cprint>\n#include \u003Cthread>\n\nvoid print(char c)\n{\n    for (int i = 0; i \u003C 5; ++i)\n    {\n        std::print(\"{}\", c);\n    }\n}\n\nint main()\n{\n    std::thread t1(print, 'A');\n    std::thread t2(print, 'B');\n\n    t1.join();\n    t2.join();\n}\n",[15,3856,3857,3863,3869,3873,3889,3893,3927,3931,3946,3950,3954,3958,3966,3970,3987,4002,4006,4015,4023],{"__ignoreMap":98},[112,3858,3859,3861],{"class":114,"line":115},[112,3860,143],{"class":142},[112,3862,147],{"class":146},[112,3864,3865,3867],{"class":114,"line":150},[112,3866,143],{"class":142},[112,3868,155],{"class":146},[112,3870,3871],{"class":114,"line":158},[112,3872,162],{"emptyLinePlaceholder":161},[112,3874,3875,3877,3879,3881,3884,3887],{"class":114,"line":165},[112,3876,168],{"class":142},[112,3878,1891],{"class":122},[112,3880,194],{"class":118},[112,3882,3883],{"class":142},"char",[112,3885,3886],{"class":783}," c",[112,3888,794],{"class":118},[112,3890,3891],{"class":114,"line":176},[112,3892,179],{"class":118},[112,3894,3895,3898,3900,3902,3905,3907,3910,3913,3915,3918,3921,3924],{"class":114,"line":182},[112,3896,3897],{"class":142},"    for",[112,3899,3165],{"class":118},[112,3901,217],{"class":142},[112,3903,3904],{"class":118}," i ",[112,3906,1432],{"class":142},[112,3908,3909],{"class":386}," 0",[112,3911,3912],{"class":118},"; i ",[112,3914,1839],{"class":142},[112,3916,3917],{"class":386}," 5",[112,3919,3920],{"class":118},"; ",[112,3922,3923],{"class":142},"++",[112,3925,3926],{"class":118},"i)\n",[112,3928,3929],{"class":114,"line":203},[112,3930,1098],{"class":118},[112,3932,3933,3935,3937,3939,3941,3943],{"class":114,"line":209},[112,3934,981],{"class":122},[112,3936,188],{"class":118},[112,3938,1943],{"class":122},[112,3940,194],{"class":118},[112,3942,249],{"class":146},[112,3944,3945],{"class":118},", c);\n",[112,3947,3948],{"class":114,"line":214},[112,3949,1117],{"class":118},[112,3951,3952],{"class":114,"line":225},[112,3953,206],{"class":118},[112,3955,3956],{"class":114,"line":230},[112,3957,162],{"emptyLinePlaceholder":161},[112,3959,3960,3962,3964],{"class":114,"line":238},[112,3961,217],{"class":142},[112,3963,220],{"class":122},[112,3965,126],{"class":118},[112,3967,3968],{"class":114,"line":260},[112,3969,179],{"class":118},[112,3971,3972,3974,3976,3979,3982,3985],{"class":114,"line":265},[112,3973,185],{"class":122},[112,3975,270],{"class":118},[112,3977,3978],{"class":122},"t1",[112,3980,3981],{"class":118},"(print, ",[112,3983,3984],{"class":146},"'A'",[112,3986,200],{"class":118},[112,3988,3989,3991,3993,3995,3997,4000],{"class":114,"line":279},[112,3990,185],{"class":122},[112,3992,270],{"class":118},[112,3994,273],{"class":122},[112,3996,3981],{"class":118},[112,3998,3999],{"class":146},"'B'",[112,4001,200],{"class":118},[112,4003,4004],{"class":114,"line":299},[112,4005,162],{"emptyLinePlaceholder":161},[112,4007,4008,4011,4013],{"class":114,"line":304},[112,4009,4010],{"class":118},"    t1.",[112,4012,310],{"class":122},[112,4014,313],{"class":118},[112,4016,4017,4019,4021],{"class":114,"line":316},[112,4018,307],{"class":118},[112,4020,310],{"class":122},[112,4022,313],{"class":118},[112,4024,4025],{"class":114,"line":335},[112,4026,206],{"class":118},[12,4028,4029],{},[81,4030,4031],{},"运行结果示例（线程调度不同，顺序可能不同）：",[92,4033,4036],{"className":4034,"code":4035,"language":97,"meta":98},[95],"BBBBBAAAAA\n",[15,4037,4035],{"__ignoreMap":98},[12,4039,4040],{},"不能依赖输出一定是：",[92,4042,4045],{"className":4043,"code":4044,"language":97,"meta":98},[95],"AAAAA\nBBBBB\n",[15,4046,4044],{"__ignoreMap":98},[12,4048,4049],{},"完全有可能是",[92,4051,4054],{"className":4052,"code":4053,"language":97,"meta":98},[95],"BBBBB\nAAAAA\n",[15,4055,4053],{"__ignoreMap":98},[12,4057,4058],{},"等很多可能性。",[12,4060,4061],{},[4062,4063],"img",{"alt":98,"src":4064},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F10\u002F05\u002F1789198016819-8e10d05f.webp",[12,4066,4067],{},"线程调度顺序由操作系统和运行环境决定。如果执行顺序本身是程序正确性的必要条件，就必须显式同步。",[63,4069,4070],{"id":4070},"常见错误",[68,4072,4074],{"id":4073},"错误忘记-join-或-detach","错误：忘记 join 或 detach",[92,4076,4078],{"className":106,"code":4077,"language":108,"meta":98,"style":98},"std::thread t(work);\n\u002F\u002F 离开作用域前没有处理 t\n",[15,4079,4080,4096],{"__ignoreMap":98},[112,4081,4082,4084,4086,4088,4090,4092,4094],{"class":114,"line":115},[112,4083,680],{"class":122},[112,4085,188],{"class":118},[112,4087,685],{"class":122},[112,4089,688],{"class":122},[112,4091,194],{"class":118},[112,4093,3238],{"class":122},[112,4095,200],{"class":118},[112,4097,4098],{"class":114,"line":150},[112,4099,4100],{"class":2601},"\u002F\u002F 离开作用域前没有处理 t\n",[12,4102,4103,4104,84],{},"结果可能是 ",[15,4105,3049],{},[68,4107,4109],{"id":4108},"错误把引用形参误认为-thread-会自动按引用传递","错误：把引用形参误认为 thread 会自动按引用传递",[92,4111,4113],{"className":106,"code":4112,"language":108,"meta":98,"style":98},"void foo(int& x);\nint value = 10;\n\n\u002F\u002F std::thread t(foo, value); \u002F\u002F 不要把它理解成自动引用传递\n",[15,4114,4115,4130,4142,4146],{"__ignoreMap":98},[112,4116,4117,4119,4121,4123,4125,4128],{"class":114,"line":115},[112,4118,168],{"class":142},[112,4120,1410],{"class":122},[112,4122,194],{"class":118},[112,4124,1641],{"class":142},[112,4126,4127],{"class":783}," x",[112,4129,200],{"class":118},[112,4131,4132,4134,4136,4138,4140],{"class":114,"line":150},[112,4133,217],{"class":142},[112,4135,2792],{"class":118},[112,4137,1432],{"class":142},[112,4139,1435],{"class":386},[112,4141,430],{"class":118},[112,4143,4144],{"class":114,"line":158},[112,4145,162],{"emptyLinePlaceholder":161},[112,4147,4148,4151],{"class":114,"line":165},[112,4149,4150],{"class":2601},"\u002F\u002F std::thread t(foo, value);",[112,4152,4153],{"class":2601}," \u002F\u002F 不要把它理解成自动引用传递\n",[12,4155,4156],{},"需要原对象引用语义时写：",[92,4158,4160],{"className":106,"code":4159,"language":108,"meta":98,"style":98},"std::thread t(foo, std::ref(value));\n",[15,4161,4162],{"__ignoreMap":98},[112,4163,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182,4184],{"class":114,"line":115},[112,4165,680],{"class":122},[112,4167,188],{"class":118},[112,4169,685],{"class":122},[112,4171,688],{"class":122},[112,4173,194],{"class":118},[112,4175,1452],{"class":122},[112,4177,696],{"class":118},[112,4179,680],{"class":122},[112,4181,188],{"class":118},[112,4183,1662],{"class":122},[112,4185,4186],{"class":118},"(value));\n",[68,4188,4190],{"id":4189},"错误detach-后引用局部变量","错误：detach 后引用局部变量",[12,4192,4193],{},"局部变量可能在线程使用前就销毁。",[68,4195,4197],{"id":4196},"错误重复-join","错误：重复 join",[92,4199,4201],{"className":106,"code":4200,"language":108,"meta":98,"style":98},"t.join();\n\u002F\u002F t.join(); \u002F\u002F 此时已经不再 joinable\n",[15,4202,4203,4211],{"__ignoreMap":98},[112,4204,4205,4207,4209],{"class":114,"line":115},[112,4206,2254],{"class":118},[112,4208,310],{"class":122},[112,4210,313],{"class":118},[112,4212,4213,4216],{"class":114,"line":150},[112,4214,4215],{"class":2601},"\u002F\u002F t.join();",[112,4217,4218],{"class":2601}," \u002F\u002F 此时已经不再 joinable\n",[68,4220,4222],{"id":4221},"错误认为线程函数结束后-joinable-自动变-false","错误：认为线程函数结束后 joinable 自动变 false",[12,4224,4225],{},"线程执行完和线程对象解除关联是两件不同的事情。",[63,4227,4229,4230],{"id":4228},"c20优先了解-stdjthread","C++20：优先了解 ",[15,4231,4232],{},"std::jthread",[12,4234,4235,4237,4238,363,4240,84],{},[15,4236,5],{}," 的一个明显风险是：必须手动确保所有控制路径最终都正确 ",[15,4239,44],{},[15,4241,48],{},[12,4243,4244],{},"C++20 提供了：",[92,4246,4248],{"className":106,"code":4247,"language":108,"meta":98,"style":98},"std::jthread\n",[15,4249,4250],{"__ignoreMap":98},[112,4251,4252,4254],{"class":114,"line":115},[112,4253,680],{"class":122},[112,4255,4256],{"class":118},"::jthread\n",[12,4258,4259,4260,4263],{},"它在析构时会自动请求停止并等待线程结束，而且支持 ",[15,4261,4262],{},"std::stop_token"," 协作式取消。",[12,4265,4266,4267,4269,4270,4272,4273,84],{},"基础原理理解完 ",[15,4268,5],{}," 后，建议继续学习本章后面的 ",[15,4271,4232],{}," 与 ",[15,4274,4262],{},[63,4276,4277],{"id":4277},"小结",[26,4279,4280,4286,4294,4299,4307,4312,4320,4325],{},[29,4281,4282,4285],{},[15,4283,4284],{},"std::thread t(f, args...)"," 的第一个参数是可调用对象，后面的参数是传给它的实参。",[29,4287,4288,4289,4291,4292,84],{},"线程参数默认会被保存，引用语义通常要显式使用 ",[15,4290,1621],{}," \u002F ",[15,4293,1854],{},[29,4295,4296,4298],{},[15,4297,44],{}," 等待线程结束，并让线程对象变为 non-joinable。",[29,4300,4301,4303,4304,4306],{},[15,4302,48],{}," 让线程脱离当前 ",[15,4305,5],{}," 对象，生命周期风险较大。",[29,4308,4309,4311],{},[15,4310,51],{}," 判断对象是否仍关联一个可 join 的线程，不等于线程此刻是否正在运行。",[29,4313,4314,4315,4317,4318,84],{},"joinable 的 ",[15,4316,5],{}," 析构会调用 ",[15,4319,3049],{},[29,4321,4322,4324],{},[15,4323,5],{}," 不可复制，但可以移动。",[29,4326,4327],{},"线程共享引用、指针或对象时，必须额外考虑对象生命周期和数据竞争。",[4329,4330,4331],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":98,"searchDepth":150,"depth":150,"links":4333},[4334,4339,4347,4356,4363,4370,4372],{"id":65,"depth":150,"text":66,"children":4335},[4336,4338],{"id":70,"depth":158,"text":4337},"std::thread 对象不是“线程本身”",{"id":666,"depth":158,"text":667},{"id":1387,"depth":150,"text":1387,"children":4340},[4341,4342,4344,4346],{"id":1390,"depth":158,"text":1390},{"id":1618,"depth":158,"text":4343},"std::ref()：真正按引用传递",{"id":1957,"depth":158,"text":4345},"std::ref(x) 和 &x 完全不是一回事",{"id":2116,"depth":158,"text":2117},{"id":2278,"depth":150,"text":2279,"children":4348},[4349,4351,4353,4355],{"id":2282,"depth":158,"text":4350},"join()：等待线程结束",{"id":2696,"depth":158,"text":4352},"detach()：线程脱离管理",{"id":2871,"depth":158,"text":4354},"joinable()：判断能否 join",{"id":3000,"depth":158,"text":3001},{"id":3206,"depth":150,"text":3206,"children":4357},[4358,4360,4361,4362],{"id":3209,"depth":158,"text":4359},"std::thread 不可复制，但可以移动",{"id":3324,"depth":158,"text":3327},{"id":3717,"depth":158,"text":3720},{"id":3851,"depth":158,"text":3851},{"id":4070,"depth":150,"text":4070,"children":4364},[4365,4366,4367,4368,4369],{"id":4073,"depth":158,"text":4074},{"id":4108,"depth":158,"text":4109},{"id":4189,"depth":158,"text":4190},{"id":4196,"depth":158,"text":4197},{"id":4221,"depth":158,"text":4222},{"id":4228,"depth":150,"text":4371},"C++20：优先了解 std::jthread",{"id":4277,"depth":150,"text":4277},"2000-1900-1100","2023-10-05","std::thread 是 C++11 提供的标准线程管理类，定义在 \u003Cthread> 中。","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-1100-std-thread",{"title":5,"description":4375},"wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread","ieF4LLiRcfbZ9hmZX5HUINZ-RAgu6t-q98qMALwsQ3g",[4387,4394,4400,4406,4412,4418,4424,4430,4436,4442,4448,4454,4460,4466,4472,4478,4484,4490,4496,4502,4508,4514,4520,4526,4532,4538,4544,4550,4556,4562,4568,4574,4580,4586,4592,4598,4604,4610,4616,4622,4627,4633,4638,4644,4650,4656,4662,4668,4674,4680,4686,4692,4698,4704,4710,4716,4722,4728,4734,4740,4746,4752,4754,4760,4766,4772,4778,4784,4790,4796,4802,4808,4814,4820,4826,4832,4838,4844,4850,4856,4862,4868,4874,4880,4886,4892,4898,4904,4910,4916,4922,4928],{"path":4388,"stem":4389,"title":4390,"authors":4391,"date":4374,"chapterOrder":4392,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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++开发环境搭建与测试",[7],"0100",0,{"path":4395,"stem":4396,"title":4397,"authors":4398,"date":4374,"chapterOrder":4399,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识",[7],"0200",{"path":4401,"stem":4402,"title":4403,"authors":4404,"date":4374,"chapterOrder":4405,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放",[7],"0300",{"path":4407,"stem":4408,"title":4409,"authors":4410,"date":4374,"chapterOrder":4411,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出",[7],"0400",{"path":4413,"stem":4414,"title":4415,"authors":4416,"date":4374,"chapterOrder":4417,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符",[7],"0500",{"path":4419,"stem":4420,"title":4421,"authors":4422,"date":4374,"chapterOrder":4423,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构",[7],"0600",{"path":4425,"stem":4426,"title":4427,"authors":4428,"date":4374,"chapterOrder":4429,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组",[7],"0700",{"path":4431,"stem":4432,"title":4433,"authors":4434,"date":4374,"chapterOrder":4435,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件",[7],"0800",{"path":4437,"stem":4438,"title":4439,"authors":4440,"date":4374,"chapterOrder":4441,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针",[7],"0900",{"path":4443,"stem":4444,"title":4445,"authors":4446,"date":4374,"chapterOrder":4447,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",[7],"1000",{"path":4449,"stem":4450,"title":4451,"authors":4452,"date":4374,"chapterOrder":4453,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期",[7],"1100",{"path":4455,"stem":4456,"title":4457,"authors":4458,"date":4374,"chapterOrder":4459,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用",[7],"1200",{"path":4461,"stem":4462,"title":4463,"authors":4464,"date":4374,"chapterOrder":4465,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高",[7],"1300",{"path":4467,"stem":4468,"title":4469,"authors":4470,"date":4374,"chapterOrder":4471,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间",[7],"1350",{"path":4473,"stem":4474,"title":4475,"authors":4476,"date":4374,"chapterOrder":4477,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装",[7],"1400-0100",{"path":4479,"stem":4480,"title":4481,"authors":4482,"date":4374,"chapterOrder":4483,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理",[7],"1400-0200",{"path":4485,"stem":4486,"title":4487,"authors":4488,"date":4374,"chapterOrder":4489,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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指针",[7],"1400-0300",{"path":4491,"stem":4492,"title":4493,"authors":4494,"date":4374,"chapterOrder":4495,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载",[7],"1400-0400",{"path":4497,"stem":4498,"title":4499,"authors":4500,"date":4374,"chapterOrder":4501,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承",[7],"1400-0500",{"path":4503,"stem":4504,"title":4505,"authors":4506,"date":4374,"chapterOrder":4507,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态",[7],"1400-0600",{"path":4509,"stem":4510,"title":4511,"authors":4512,"date":4374,"chapterOrder":4513,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象",[7],"1400",{"path":4515,"stem":4516,"title":4517,"authors":4518,"date":4374,"chapterOrder":4519,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针",[7],"1450",{"path":4521,"stem":4522,"title":4523,"authors":4524,"date":4374,"chapterOrder":4525,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作",[7],"1500",{"path":4527,"stem":4528,"title":4529,"authors":4530,"date":4374,"chapterOrder":4531,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理",[7],"1600",{"path":4533,"stem":4534,"title":4535,"authors":4536,"date":4374,"chapterOrder":4537,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板",[7],"1700",{"path":4539,"stem":4540,"title":4541,"authors":4542,"date":4374,"chapterOrder":4543,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识",[7],"1800-0100",{"path":4545,"stem":4546,"title":4547,"authors":4548,"date":4374,"chapterOrder":4549,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array",[7],"1800-0200",{"path":4551,"stem":4552,"title":4553,"authors":4554,"date":4374,"chapterOrder":4555,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器",[7],"1800-0300",{"path":4557,"stem":4558,"title":4559,"authors":4560,"date":4374,"chapterOrder":4561,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器",[7],"1800-0400",{"path":4563,"stem":4564,"title":4565,"authors":4566,"date":4374,"chapterOrder":4567,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器",[7],"1800-0500",{"path":4569,"stem":4570,"title":4571,"authors":4572,"date":4374,"chapterOrder":4573,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器",[7],"1800-0600",{"path":4575,"stem":4576,"title":4577,"authors":4578,"date":4374,"chapterOrder":4579,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器",[7],"1800-0700",{"path":4581,"stem":4582,"title":4583,"authors":4584,"date":4374,"chapterOrder":4585,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器",[7],"1800-0800",{"path":4587,"stem":4588,"title":4589,"authors":4590,"date":4374,"chapterOrder":4591,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器",[7],"1800-0900",{"path":4593,"stem":4594,"title":4595,"authors":4596,"date":4374,"chapterOrder":4597,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器",[7],"1800-1000",{"path":4599,"stem":4600,"title":4601,"authors":4602,"date":4374,"chapterOrder":4603,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词",[7],"1800-1100",{"path":4605,"stem":4606,"title":4607,"authors":4608,"date":4374,"chapterOrder":4609,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法",[7],"1800-1200",{"path":4611,"stem":4612,"title":4613,"authors":4614,"date":4374,"chapterOrder":4615,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程",[7],"1800",{"path":4617,"stem":4618,"title":4619,"authors":4620,"date":4374,"chapterOrder":4621,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换",[7],"1900",{"path":4623,"stem":4624,"title":3577,"authors":4625,"date":4374,"chapterOrder":4626,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto",[7],"2000-0100",{"path":4628,"stem":4629,"title":4630,"authors":4631,"date":4374,"chapterOrder":4632,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr",[7],"2000-0200",{"path":4634,"stem":4635,"title":416,"authors":4636,"date":4374,"chapterOrder":4637,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using",[7],"2000-0300",{"path":4639,"stem":4640,"title":4641,"authors":4642,"date":4374,"chapterOrder":4643,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class",[7],"2000-0400",{"path":4645,"stem":4646,"title":4647,"authors":4648,"date":4374,"chapterOrder":4649,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环",[7],"2000-0500",{"path":4651,"stem":4652,"title":4653,"authors":4654,"date":4374,"chapterOrder":4655,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定",[7],"2000-0600",{"path":4657,"stem":4658,"title":4659,"authors":4660,"date":4374,"chapterOrder":4661,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr",[7],"2000-0700",{"path":4663,"stem":4664,"title":4665,"authors":4666,"date":4374,"chapterOrder":4667,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII",[7],"2000-0800",{"path":4669,"stem":4670,"title":4671,"authors":4672,"date":4374,"chapterOrder":4673,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针",[7],"2000-0900",{"path":4675,"stem":4676,"title":4677,"authors":4678,"date":4374,"chapterOrder":4679,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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-右值引用和移动语义","右值引用和移动语义",[7],"2000-1000",{"path":4681,"stem":4682,"title":4683,"authors":4684,"date":4374,"chapterOrder":4685,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式",[7],"2000-1100",{"path":4687,"stem":4688,"title":4689,"authors":4690,"date":4374,"chapterOrder":4691,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function",[7],"2000-1200",{"path":4693,"stem":4694,"title":4695,"authors":4696,"date":4374,"chapterOrder":4697,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind",[7],"2000-1300",{"path":4699,"stem":4700,"title":4701,"authors":4702,"date":4374,"chapterOrder":4703,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional",[7],"2000-1400",{"path":4705,"stem":4706,"title":4707,"authors":4708,"date":4374,"chapterOrder":4709,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant",[7],"2000-1500",{"path":4711,"stem":4712,"title":4713,"authors":4714,"date":4374,"chapterOrder":4715,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span",[7],"2000-1600",{"path":4717,"stem":4718,"title":4719,"authors":4720,"date":4374,"chapterOrder":4721,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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",[7],"2000-1700",{"path":4723,"stem":4724,"title":4725,"authors":4726,"date":4374,"chapterOrder":4727,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono",[7],"2000-1800",{"path":4729,"stem":4730,"title":4731,"authors":4732,"date":4374,"chapterOrder":4733,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-bing-fa-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-并发是什么","并发是什么",[7],"2000-1900-0100",{"path":4735,"stem":4736,"title":4737,"authors":4738,"date":4374,"chapterOrder":4739,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-bing-xing-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-并行是什么","并行是什么",[7],"2000-1900-0200",{"path":4741,"stem":4742,"title":4743,"authors":4744,"date":4374,"chapterOrder":4745,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-xie-cheng-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-协程是什么","协程是什么",[7],"2000-1900-0300",{"path":4747,"stem":4748,"title":4749,"authors":4750,"date":4374,"chapterOrder":4751,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1000-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1000-并发编程","并发编程",[7],"2000-1900-1000",{"path":4382,"stem":4384,"title":5,"authors":4753,"date":4374,"chapterOrder":4373,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},[7],{"path":4755,"stem":4756,"title":4757,"authors":4758,"date":4374,"chapterOrder":4759,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1200-mutex-lock-guard","mutex 与 RAII 锁",[7],"2000-1900-1200",{"path":4761,"stem":4762,"title":4763,"authors":4764,"date":4374,"chapterOrder":4765,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1300-std-atomic","std::atomic",[7],"2000-1900-1300",{"path":4767,"stem":4768,"title":4769,"authors":4770,"date":4374,"chapterOrder":4771,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1400-condition-variable","condition_variable",[7],"2000-1900-1400",{"path":4773,"stem":4774,"title":4775,"authors":4776,"date":4374,"chapterOrder":4777,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1500-future-async-promise","future、async、promise 与 packaged_task",[7],"2000-1900-1500",{"path":4779,"stem":4780,"title":4781,"authors":4782,"date":4374,"chapterOrder":4783,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1600-jthread-stop-token","jthread 与 stop_token",[7],"2000-1900-1600",{"path":4785,"stem":4786,"title":4787,"authors":4788,"date":4374,"chapterOrder":4789,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1700-semaphore-latch-barrier","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1700-semaphore-latch-barrier","semaphore、latch 与 barrier",[7],"2000-1900-1700",{"path":4791,"stem":4792,"title":4793,"authors":4794,"date":4374,"chapterOrder":4795,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bing-xing-yu-xie-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发并行与协程","并发、并行与协程",[7],"2000-1900",{"path":4797,"stem":4798,"title":4799,"authors":4800,"date":4374,"chapterOrder":4801,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem",[7],"2000-2000",{"path":4803,"stem":4804,"title":4805,"authors":4806,"date":4374,"chapterOrder":4807,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介",[7],"2000-2100",{"path":4809,"stem":4810,"title":4811,"authors":4812,"date":4374,"chapterOrder":4813,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++",[7],"2000",{"path":4815,"stem":4816,"title":4817,"authors":4818,"date":4374,"chapterOrder":4819,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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",[7],"2100-0100-0100",{"path":4821,"stem":4822,"title":4823,"authors":4824,"date":4374,"chapterOrder":4825,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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 基础",[7],"2100-0100-0200",{"path":4827,"stem":4828,"title":4829,"authors":4830,"date":4374,"chapterOrder":4831,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信教学",[7],"2100-0100-0300",{"path":4833,"stem":4834,"title":4835,"authors":4836,"date":4374,"chapterOrder":4837,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0350-chuan-kou-tong-xin-chuan-kou-bao-xie-yi-shi-li","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0350-串口通信串口包协议实例","串口通信串口包协议实例",[7],"2100-0100-0350",{"path":4839,"stem":4840,"title":4841,"authors":4842,"date":4374,"chapterOrder":4843,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信",[7],"2100-0100-0400",{"path":4845,"stem":4846,"title":4847,"authors":4848,"date":4374,"chapterOrder":4849,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信",[7],"2100-0100-0500",{"path":4851,"stem":4852,"title":4853,"authors":4854,"date":4374,"chapterOrder":4855,"chapterDepth":150,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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 集成",[7],"2100-0100-0600",{"path":4857,"stem":4858,"title":4859,"authors":4860,"date":4374,"chapterOrder":4861,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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库",[7],"2100-0100",{"path":4863,"stem":4864,"title":4865,"authors":4866,"date":4374,"chapterOrder":4867,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库",[7],"2100-0200",{"path":4869,"stem":4870,"title":4871,"authors":4872,"date":4374,"chapterOrder":4873,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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计算机视觉库",[7],"2100-0300",{"path":4875,"stem":4876,"title":4877,"authors":4878,"date":4374,"chapterOrder":4879,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库",[7],"2100-0400",{"path":4881,"stem":4882,"title":4883,"authors":4884,"date":4374,"chapterOrder":4885,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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 李群李代数库",[7],"2100-0500",{"path":4887,"stem":4888,"title":4889,"authors":4890,"date":4374,"chapterOrder":4891,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习",[7],"2100",{"path":4893,"stem":4894,"title":4895,"authors":4896,"date":4374,"chapterOrder":4897,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装",[7],"2200-0100",{"path":4899,"stem":4900,"title":4901,"authors":4902,"date":4374,"chapterOrder":4903,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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与公共编译选项",[7],"2200-0200",{"path":4905,"stem":4906,"title":4907,"authors":4908,"date":4374,"chapterOrder":4909,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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详解",[7],"2200-0300",{"path":4911,"stem":4912,"title":4913,"authors":4914,"date":4374,"chapterOrder":4915,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法",[7],"2200-0400",{"path":4917,"stem":4918,"title":4919,"authors":4920,"date":4374,"chapterOrder":4921,"chapterDepth":115,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\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-模板扩展与常见问题","模板扩展与常见问题",[7],"2200-0500",{"path":4923,"stem":4924,"title":4925,"authors":4926,"date":4374,"chapterOrder":4927,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":4380},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板",[7],"2200",{"path":4377,"stem":4929,"title":4930,"authors":4931,"date":4374,"chapterOrder":4932,"chapterDepth":4393,"docKey":4376,"docRoot":4377,"docTitle":4378,"isWikiDoc":161,"isWikiIndex":161},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",[7],null,[4934,4936,4939,4942],{"name":7,"image":4935},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":4937,"image":4938},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":4940,"image":4941},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":4943,"image":4944},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431898961]