[{"data":1,"prerenderedAt":2413},["ShallowReactive",2],{"wiki-page-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":3,"wiki-doc-items-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":1968,"language-switcher-data-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":2397,"wiki-i18n-paths-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":2412},{"id":4,"title":5,"body":6,"canonicalPath":1950,"chapterDepth":49,"chapterOrder":1951,"date":1952,"description":1953,"docI18nKey":1954,"docKey":1955,"docRoot":1956,"docTitle":1957,"extension":1958,"i18nKey":1959,"isBlogPost":1960,"isWikiDoc":234,"isWikiIndex":1960,"layout":1961,"legacyPath":1962,"locale":1963,"localeSlug":1964,"meta":1965,"navigation":234,"path":1950,"seo":1966,"sourcePath":1962,"sourceStem":1959,"stem":1959,"wikiDepth":38,"__hash__":1967},"content\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier.md","semaphore、latch 与 barrier",{"type":7,"value":8,"toc":1922},"minimark",[9,25,71,78,105,108,116,119,122,138,141,149,152,158,161,175,178,182,185,597,600,604,633,636,642,645,651,654,657,664,667,709,712,732,735,742,745,748,759,762,786,789,803,806,819,822,825,831,835,838,840,857,860,863,869,872,879,884,887,909,912,927,930,944,947,951,1205,1208,1220,1223,1236,1239,1270,1275,1281,1285,1294,1297,1303,1306,1317,1324,1330,1335,1338,1344,1347,1351,1640,1643,1647,1650,1653,1659,1663,1668,1671,1677,1680,1683,1690,1693,1708,1711,1716,1719,1723,1799,1803,1806,1812,1815,1818,1824,1827,1830,1833,1847,1851,1888,1891,1918],[10,11,12,13,17,18,17,21,24],"p",{},"C++20 在 ",[14,15,16],"code",{},"\u003Csemaphore>","、",[14,19,20],{},"\u003Clatch>",[14,22,23],{},"\u003Cbarrier>"," 中加入了三类更高层的同步工具：",[26,27,32],"pre",{"className":28,"code":29,"language":30,"meta":31,"style":31},"language-cpp shiki shiki-themes github-light github-dark","std::counting_semaphore\nstd::binary_semaphore\nstd::latch\nstd::barrier\n","cpp","",[14,33,34,47,55,63],{"__ignoreMap":31},[35,36,39,43],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"sScJk","std",[35,44,46],{"class":45},"sVt8B","::counting_semaphore\n",[35,48,50,52],{"class":37,"line":49},2,[35,51,42],{"class":41},[35,53,54],{"class":45},"::binary_semaphore\n",[35,56,58,60],{"class":37,"line":57},3,[35,59,42],{"class":41},[35,61,62],{"class":45},"::latch\n",[35,64,66,68],{"class":37,"line":65},4,[35,67,42],{"class":41},[35,69,70],{"class":45},"::barrier\n",[10,72,73,74,77],{},"它们解决的问题和 ",[14,75,76],{},"mutex"," 不同：",[79,80,81,87,93,99],"ul",{},[82,83,84,86],"li",{},[14,85,76],{},"：保护共享临界区；",[82,88,89,92],{},[14,90,91],{},"semaphore","：限制同时进入某个区域的线程数量，或表示可用资源数量；",[82,94,95,98],{},[14,96,97],{},"latch","：一次性等待若干参与者全部到达；",[82,100,101,104],{},[14,102,103],{},"barrier","：多个线程反复进行“阶段同步”。",[10,106,107],{},"这些工具不是并发入门第一优先级，但理解后可以避免手写复杂的条件变量计数逻辑。",[109,110,112,113],"h2",{"id":111},"_1-stdcounting_semaphore","1. ",[14,114,115],{},"std::counting_semaphore",[10,117,118],{},"计数信号量内部维护一个计数值。",[10,120,121],{},"线程进入前调用：",[26,123,125],{"className":28,"code":124,"language":30,"meta":31,"style":31},"semaphore.acquire();\n",[14,126,127],{"__ignoreMap":31},[35,128,129,132,135],{"class":37,"line":38},[35,130,131],{"class":45},"semaphore.",[35,133,134],{"class":41},"acquire",[35,136,137],{"class":45},"();\n",[10,139,140],{},"如果计数大于 0：",[26,142,147],{"className":143,"code":145,"language":146,"meta":31},[144],"language-text","计数减 1\n线程继续\n","text",[14,148,145],{"__ignoreMap":31},[10,150,151],{},"如果计数为 0：",[26,153,156],{"className":154,"code":155,"language":146,"meta":31},[144],"线程阻塞等待\n",[14,157,155],{"__ignoreMap":31},[10,159,160],{},"使用完资源后调用：",[26,162,164],{"className":28,"code":163,"language":30,"meta":31,"style":31},"semaphore.release();\n",[14,165,166],{"__ignoreMap":31},[35,167,168,170,173],{"class":37,"line":38},[35,169,131],{"class":45},[35,171,172],{"class":41},"release",[35,174,137],{"class":45},[10,176,177],{},"计数增加，并可能唤醒等待线程。",[109,179,181],{"id":180},"_2-限制并发数量","2. 限制并发数量",[10,183,184],{},"例如只允许最多两个线程同时执行某段任务：",[26,186,188],{"className":28,"code":187,"language":30,"meta":31,"style":31},"#include \u003Cchrono>\n#include \u003Ciostream>\n#include \u003Csemaphore>\n#include \u003Cthread>\n#include \u003Cvector>\n\nusing namespace std::chrono_literals;\n\nstd::counting_semaphore\u003C2> slots(2);\n\nvoid worker(int id)\n{\n    slots.acquire();\n\n    std::cout \u003C\u003C \"start \" \u003C\u003C id \u003C\u003C '\\n';\n    std::this_thread::sleep_for(500ms);\n    std::cout \u003C\u003C \"end \" \u003C\u003C id \u003C\u003C '\\n';\n\n    slots.release();\n}\n\nint main()\n{\n    std::vector\u003Cstd::thread> threads;\n\n    for (int i = 0; i \u003C 5; ++i)\n    {\n        threads.emplace_back(worker, i);\n    }\n\n    for (auto& thread : threads)\n    {\n        thread.join();\n    }\n}\n",[14,189,190,200,207,214,221,229,236,257,262,293,298,319,325,335,340,374,399,425,430,439,445,450,461,466,487,492,529,535,547,553,558,571,576,587,592],{"__ignoreMap":31},[35,191,192,196],{"class":37,"line":38},[35,193,195],{"class":194},"szBVR","#include",[35,197,199],{"class":198},"sZZnC"," \u003Cchrono>\n",[35,201,202,204],{"class":37,"line":49},[35,203,195],{"class":194},[35,205,206],{"class":198}," \u003Ciostream>\n",[35,208,209,211],{"class":37,"line":57},[35,210,195],{"class":194},[35,212,213],{"class":198}," \u003Csemaphore>\n",[35,215,216,218],{"class":37,"line":65},[35,217,195],{"class":194},[35,219,220],{"class":198}," \u003Cthread>\n",[35,222,224,226],{"class":37,"line":223},5,[35,225,195],{"class":194},[35,227,228],{"class":198}," \u003Cvector>\n",[35,230,232],{"class":37,"line":231},6,[35,233,235],{"emptyLinePlaceholder":234},true,"\n",[35,237,239,242,245,248,251,254],{"class":37,"line":238},7,[35,240,241],{"class":194},"using",[35,243,244],{"class":194}," namespace",[35,246,247],{"class":41}," std",[35,249,250],{"class":45},"::",[35,252,253],{"class":41},"chrono_literals",[35,255,256],{"class":45},";\n",[35,258,260],{"class":37,"line":259},8,[35,261,235],{"emptyLinePlaceholder":234},[35,263,265,267,269,272,275,279,282,285,288,290],{"class":37,"line":264},9,[35,266,42],{"class":41},[35,268,250],{"class":45},[35,270,271],{"class":41},"counting_semaphore",[35,273,274],{"class":45},"\u003C",[35,276,278],{"class":277},"sj4cs","2",[35,280,281],{"class":45},"> ",[35,283,284],{"class":41},"slots",[35,286,287],{"class":45},"(",[35,289,278],{"class":277},[35,291,292],{"class":45},");\n",[35,294,296],{"class":37,"line":295},10,[35,297,235],{"emptyLinePlaceholder":234},[35,299,301,304,307,309,312,316],{"class":37,"line":300},11,[35,302,303],{"class":194},"void",[35,305,306],{"class":41}," worker",[35,308,287],{"class":45},[35,310,311],{"class":194},"int",[35,313,315],{"class":314},"s4XuR"," id",[35,317,318],{"class":45},")\n",[35,320,322],{"class":37,"line":321},12,[35,323,324],{"class":45},"{\n",[35,326,328,331,333],{"class":37,"line":327},13,[35,329,330],{"class":45},"    slots.",[35,332,134],{"class":41},[35,334,137],{"class":45},[35,336,338],{"class":37,"line":337},14,[35,339,235],{"emptyLinePlaceholder":234},[35,341,343,346,349,352,355,358,361,363,366,369,372],{"class":37,"line":342},15,[35,344,345],{"class":41},"    std",[35,347,348],{"class":45},"::cout ",[35,350,351],{"class":194},"\u003C\u003C",[35,353,354],{"class":198}," \"start \"",[35,356,357],{"class":194}," \u003C\u003C",[35,359,360],{"class":45}," id ",[35,362,351],{"class":194},[35,364,365],{"class":198}," '",[35,367,368],{"class":277},"\\n",[35,370,371],{"class":198},"'",[35,373,256],{"class":45},[35,375,377,379,381,384,386,389,391,394,397],{"class":37,"line":376},16,[35,378,345],{"class":41},[35,380,250],{"class":45},[35,382,383],{"class":41},"this_thread",[35,385,250],{"class":45},[35,387,388],{"class":41},"sleep_for",[35,390,287],{"class":45},[35,392,393],{"class":277},"500",[35,395,396],{"class":194},"ms",[35,398,292],{"class":45},[35,400,402,404,406,408,411,413,415,417,419,421,423],{"class":37,"line":401},17,[35,403,345],{"class":41},[35,405,348],{"class":45},[35,407,351],{"class":194},[35,409,410],{"class":198}," \"end \"",[35,412,357],{"class":194},[35,414,360],{"class":45},[35,416,351],{"class":194},[35,418,365],{"class":198},[35,420,368],{"class":277},[35,422,371],{"class":198},[35,424,256],{"class":45},[35,426,428],{"class":37,"line":427},18,[35,429,235],{"emptyLinePlaceholder":234},[35,431,433,435,437],{"class":37,"line":432},19,[35,434,330],{"class":45},[35,436,172],{"class":41},[35,438,137],{"class":45},[35,440,442],{"class":37,"line":441},20,[35,443,444],{"class":45},"}\n",[35,446,448],{"class":37,"line":447},21,[35,449,235],{"emptyLinePlaceholder":234},[35,451,453,455,458],{"class":37,"line":452},22,[35,454,311],{"class":194},[35,456,457],{"class":41}," main",[35,459,460],{"class":45},"()\n",[35,462,464],{"class":37,"line":463},23,[35,465,324],{"class":45},[35,467,469,471,474,476,478,481,484],{"class":37,"line":468},24,[35,470,345],{"class":41},[35,472,473],{"class":45},"::vector",[35,475,274],{"class":194},[35,477,42],{"class":41},[35,479,480],{"class":45},"::thread",[35,482,483],{"class":194},">",[35,485,486],{"class":45}," threads;\n",[35,488,490],{"class":37,"line":489},25,[35,491,235],{"emptyLinePlaceholder":234},[35,493,495,498,501,503,506,509,512,515,517,520,523,526],{"class":37,"line":494},26,[35,496,497],{"class":194},"    for",[35,499,500],{"class":45}," (",[35,502,311],{"class":194},[35,504,505],{"class":45}," i ",[35,507,508],{"class":194},"=",[35,510,511],{"class":277}," 0",[35,513,514],{"class":45},"; i ",[35,516,274],{"class":194},[35,518,519],{"class":277}," 5",[35,521,522],{"class":45},"; ",[35,524,525],{"class":194},"++",[35,527,528],{"class":45},"i)\n",[35,530,532],{"class":37,"line":531},27,[35,533,534],{"class":45},"    {\n",[35,536,538,541,544],{"class":37,"line":537},28,[35,539,540],{"class":45},"        threads.",[35,542,543],{"class":41},"emplace_back",[35,545,546],{"class":45},"(worker, i);\n",[35,548,550],{"class":37,"line":549},29,[35,551,552],{"class":45},"    }\n",[35,554,556],{"class":37,"line":555},30,[35,557,235],{"emptyLinePlaceholder":234},[35,559,561,563,565,568],{"class":37,"line":560},31,[35,562,497],{"class":194},[35,564,500],{"class":45},[35,566,567],{"class":194},"auto&",[35,569,570],{"class":45}," thread : threads)\n",[35,572,574],{"class":37,"line":573},32,[35,575,534],{"class":45},[35,577,579,582,585],{"class":37,"line":578},33,[35,580,581],{"class":45},"        thread.",[35,583,584],{"class":41},"join",[35,586,137],{"class":45},[35,588,590],{"class":37,"line":589},34,[35,591,552],{"class":45},[35,593,595],{"class":37,"line":594},35,[35,596,444],{"class":45},[10,598,599],{},"即使创建了 5 个线程，真正进入受限区域的线程最多只有 2 个。",[109,601,603],{"id":602},"_3-模板参数和初始计数不是同一个东西","3. 模板参数和初始计数不是同一个东西",[26,605,607],{"className":28,"code":606,"language":30,"meta":31,"style":31},"std::counting_semaphore\u003C10> semaphore(3);\n",[14,608,609],{"__ignoreMap":31},[35,610,611,613,615,617,619,622,624,626,628,631],{"class":37,"line":38},[35,612,42],{"class":41},[35,614,250],{"class":45},[35,616,271],{"class":41},[35,618,274],{"class":45},[35,620,621],{"class":277},"10",[35,623,281],{"class":45},[35,625,91],{"class":41},[35,627,287],{"class":45},[35,629,630],{"class":277},"3",[35,632,292],{"class":45},[10,634,635],{},"其中：",[26,637,640],{"className":638,"code":639,"language":146,"meta":31},[144],"10\n",[14,641,639],{"__ignoreMap":31},[10,643,644],{},"表示实现至少支持的最大计数上界；",[26,646,649],{"className":647,"code":648,"language":146,"meta":31},[144],"3\n",[14,650,648],{"__ignoreMap":31},[10,652,653],{},"表示当前初始计数。",[10,655,656],{},"不要把两者混在一起理解。",[109,658,660,661],{"id":659},"_4-try_acquire","4. ",[14,662,663],{},"try_acquire()",[10,665,666],{},"如果不想阻塞，可以使用：",[26,668,670],{"className":28,"code":669,"language":30,"meta":31,"style":31},"if (semaphore.try_acquire())\n{\n    \u002F\u002F 成功获得一个许可\n    semaphore.release();\n}\n",[14,671,672,686,690,696,705],{"__ignoreMap":31},[35,673,674,677,680,683],{"class":37,"line":38},[35,675,676],{"class":194},"if",[35,678,679],{"class":45}," (semaphore.",[35,681,682],{"class":41},"try_acquire",[35,684,685],{"class":45},"())\n",[35,687,688],{"class":37,"line":49},[35,689,324],{"class":45},[35,691,692],{"class":37,"line":57},[35,693,695],{"class":694},"sJ8bj","    \u002F\u002F 成功获得一个许可\n",[35,697,698,701,703],{"class":37,"line":65},[35,699,700],{"class":45},"    semaphore.",[35,702,172],{"class":41},[35,704,137],{"class":45},[35,706,707],{"class":37,"line":223},[35,708,444],{"class":45},[10,710,711],{},"还有带时间限制的版本：",[26,713,715],{"className":28,"code":714,"language":30,"meta":31,"style":31},"try_acquire_for(...)\ntry_acquire_until(...)\n",[14,716,717,725],{"__ignoreMap":31},[35,718,719,722],{"class":37,"line":38},[35,720,721],{"class":41},"try_acquire_for",[35,723,724],{"class":45},"(...)\n",[35,726,727,730],{"class":37,"line":49},[35,728,729],{"class":41},"try_acquire_until",[35,731,724],{"class":45},[10,733,734],{},"适合“等不到资源就做其他事情”的场景。",[109,736,738,739],{"id":737},"_5-stdbinary_semaphore","5. ",[14,740,741],{},"std::binary_semaphore",[10,743,744],{},"二值信号量只有两种状态，可以理解为计数最多为 1 的 semaphore。",[10,746,747],{},"标准库提供别名：",[26,749,751],{"className":28,"code":750,"language":30,"meta":31,"style":31},"std::binary_semaphore\n",[14,752,753],{"__ignoreMap":31},[35,754,755,757],{"class":37,"line":38},[35,756,42],{"class":41},[35,758,54],{"class":45},[10,760,761],{},"例如：",[26,763,765],{"className":28,"code":764,"language":30,"meta":31,"style":31},"std::binary_semaphore signal(0);\n",[14,766,767],{"__ignoreMap":31},[35,768,769,771,773,776,779,781,784],{"class":37,"line":38},[35,770,42],{"class":41},[35,772,250],{"class":45},[35,774,775],{"class":41},"binary_semaphore",[35,777,778],{"class":41}," signal",[35,780,287],{"class":45},[35,782,783],{"class":277},"0",[35,785,292],{"class":45},[10,787,788],{},"一个线程：",[26,790,792],{"className":28,"code":791,"language":30,"meta":31,"style":31},"signal.acquire();\n",[14,793,794],{"__ignoreMap":31},[35,795,796,799,801],{"class":37,"line":38},[35,797,798],{"class":45},"signal.",[35,800,134],{"class":41},[35,802,137],{"class":45},[10,804,805],{},"另一个线程：",[26,807,809],{"className":28,"code":808,"language":30,"meta":31,"style":31},"signal.release();\n",[14,810,811],{"__ignoreMap":31},[35,812,813,815,817],{"class":37,"line":38},[35,814,798],{"class":45},[35,816,172],{"class":41},[35,818,137],{"class":45},[10,820,821],{},"它可以用于简单的“一次允许一个等待者继续”的同步。",[10,823,824],{},"不过二值信号量和 mutex 的语义仍然不同：",[826,827,828],"blockquote",{},[10,829,830],{},"mutex 强调所有权：由获得锁的线程释放；semaphore 强调许可数量，释放许可的线程不一定是获得许可的那个线程。",[109,832,834],{"id":833},"_6-semaphore-不能自动保护复杂共享状态","6. semaphore 不能自动保护复杂共享状态",[10,836,837],{},"有了 semaphore 并不意味着共享容器就自动线程安全。",[10,839,761],{},[26,841,843],{"className":28,"code":842,"language":30,"meta":31,"style":31},"std::vector\u003Cint> data;\n",[14,844,845],{"__ignoreMap":31},[35,846,847,849,851,854],{"class":37,"line":38},[35,848,42],{"class":41},[35,850,473],{"class":45},[35,852,853],{"class":194},"\u003Cint>",[35,855,856],{"class":45}," data;\n",[10,858,859],{},"如果多个线程同时修改这个 vector，仍然需要正确同步。",[10,861,862],{},"semaphore 常用于：",[26,864,867],{"className":865,"code":866,"language":146,"meta":31},[144],"控制并发数量\n限制资源池容量\n表示可用资源数\n线程间发放许可\n",[14,868,866],{"__ignoreMap":31},[10,870,871],{},"而不是简单替代 mutex。",[109,873,875,876],{"id":874},"_7-stdlatch","7. ",[14,877,878],{},"std::latch",[10,880,881,883],{},[14,882,878],{}," 是一个一次性倒计时同步点。",[10,885,886],{},"创建时指定计数：",[26,888,890],{"className":28,"code":889,"language":30,"meta":31,"style":31},"std::latch done(3);\n",[14,891,892],{"__ignoreMap":31},[35,893,894,896,898,900,903,905,907],{"class":37,"line":38},[35,895,42],{"class":41},[35,897,250],{"class":45},[35,899,97],{"class":41},[35,901,902],{"class":41}," done",[35,904,287],{"class":45},[35,906,630],{"class":277},[35,908,292],{"class":45},[10,910,911],{},"参与者完成后调用：",[26,913,915],{"className":28,"code":914,"language":30,"meta":31,"style":31},"done.count_down();\n",[14,916,917],{"__ignoreMap":31},[35,918,919,922,925],{"class":37,"line":38},[35,920,921],{"class":45},"done.",[35,923,924],{"class":41},"count_down",[35,926,137],{"class":45},[10,928,929],{},"等待方调用：",[26,931,933],{"className":28,"code":932,"language":30,"meta":31,"style":31},"done.wait();\n",[14,934,935],{"__ignoreMap":31},[35,936,937,939,942],{"class":37,"line":38},[35,938,921],{"class":45},[35,940,941],{"class":41},"wait",[35,943,137],{"class":45},[10,945,946],{},"当计数降到 0 后，所有等待者继续执行。",[109,948,950],{"id":949},"_8-latch-示例","8. latch 示例",[26,952,954],{"className":28,"code":953,"language":30,"meta":31,"style":31},"#include \u003Ciostream>\n#include \u003Clatch>\n#include \u003Cthread>\n#include \u003Cvector>\n\nstd::latch done(3);\n\nvoid worker(int id)\n{\n    std::cout \u003C\u003C \"worker \" \u003C\u003C id \u003C\u003C \" done\\n\";\n    done.count_down();\n}\n\nint main()\n{\n    std::vector\u003Cstd::thread> threads;\n\n    for (int i = 0; i \u003C 3; ++i)\n    {\n        threads.emplace_back(worker, i);\n    }\n\n    done.wait();\n    std::cout \u003C\u003C \"all workers reached the latch\\n\";\n\n    for (auto& thread : threads)\n    {\n        thread.join();\n    }\n}\n",[14,955,956,962,969,975,981,985,1001,1005,1019,1023,1050,1059,1063,1067,1075,1079,1095,1099,1126,1130,1138,1142,1146,1154,1171,1175,1185,1189,1197,1201],{"__ignoreMap":31},[35,957,958,960],{"class":37,"line":38},[35,959,195],{"class":194},[35,961,206],{"class":198},[35,963,964,966],{"class":37,"line":49},[35,965,195],{"class":194},[35,967,968],{"class":198}," \u003Clatch>\n",[35,970,971,973],{"class":37,"line":57},[35,972,195],{"class":194},[35,974,220],{"class":198},[35,976,977,979],{"class":37,"line":65},[35,978,195],{"class":194},[35,980,228],{"class":198},[35,982,983],{"class":37,"line":223},[35,984,235],{"emptyLinePlaceholder":234},[35,986,987,989,991,993,995,997,999],{"class":37,"line":231},[35,988,42],{"class":41},[35,990,250],{"class":45},[35,992,97],{"class":41},[35,994,902],{"class":41},[35,996,287],{"class":45},[35,998,630],{"class":277},[35,1000,292],{"class":45},[35,1002,1003],{"class":37,"line":238},[35,1004,235],{"emptyLinePlaceholder":234},[35,1006,1007,1009,1011,1013,1015,1017],{"class":37,"line":259},[35,1008,303],{"class":194},[35,1010,306],{"class":41},[35,1012,287],{"class":45},[35,1014,311],{"class":194},[35,1016,315],{"class":314},[35,1018,318],{"class":45},[35,1020,1021],{"class":37,"line":264},[35,1022,324],{"class":45},[35,1024,1025,1027,1029,1031,1034,1036,1038,1040,1043,1045,1048],{"class":37,"line":295},[35,1026,345],{"class":41},[35,1028,348],{"class":45},[35,1030,351],{"class":194},[35,1032,1033],{"class":198}," \"worker \"",[35,1035,357],{"class":194},[35,1037,360],{"class":45},[35,1039,351],{"class":194},[35,1041,1042],{"class":198}," \" done",[35,1044,368],{"class":277},[35,1046,1047],{"class":198},"\"",[35,1049,256],{"class":45},[35,1051,1052,1055,1057],{"class":37,"line":300},[35,1053,1054],{"class":45},"    done.",[35,1056,924],{"class":41},[35,1058,137],{"class":45},[35,1060,1061],{"class":37,"line":321},[35,1062,444],{"class":45},[35,1064,1065],{"class":37,"line":327},[35,1066,235],{"emptyLinePlaceholder":234},[35,1068,1069,1071,1073],{"class":37,"line":337},[35,1070,311],{"class":194},[35,1072,457],{"class":41},[35,1074,460],{"class":45},[35,1076,1077],{"class":37,"line":342},[35,1078,324],{"class":45},[35,1080,1081,1083,1085,1087,1089,1091,1093],{"class":37,"line":376},[35,1082,345],{"class":41},[35,1084,473],{"class":45},[35,1086,274],{"class":194},[35,1088,42],{"class":41},[35,1090,480],{"class":45},[35,1092,483],{"class":194},[35,1094,486],{"class":45},[35,1096,1097],{"class":37,"line":401},[35,1098,235],{"emptyLinePlaceholder":234},[35,1100,1101,1103,1105,1107,1109,1111,1113,1115,1117,1120,1122,1124],{"class":37,"line":427},[35,1102,497],{"class":194},[35,1104,500],{"class":45},[35,1106,311],{"class":194},[35,1108,505],{"class":45},[35,1110,508],{"class":194},[35,1112,511],{"class":277},[35,1114,514],{"class":45},[35,1116,274],{"class":194},[35,1118,1119],{"class":277}," 3",[35,1121,522],{"class":45},[35,1123,525],{"class":194},[35,1125,528],{"class":45},[35,1127,1128],{"class":37,"line":432},[35,1129,534],{"class":45},[35,1131,1132,1134,1136],{"class":37,"line":441},[35,1133,540],{"class":45},[35,1135,543],{"class":41},[35,1137,546],{"class":45},[35,1139,1140],{"class":37,"line":447},[35,1141,552],{"class":45},[35,1143,1144],{"class":37,"line":452},[35,1145,235],{"emptyLinePlaceholder":234},[35,1147,1148,1150,1152],{"class":37,"line":463},[35,1149,1054],{"class":45},[35,1151,941],{"class":41},[35,1153,137],{"class":45},[35,1155,1156,1158,1160,1162,1165,1167,1169],{"class":37,"line":468},[35,1157,345],{"class":41},[35,1159,348],{"class":45},[35,1161,351],{"class":194},[35,1163,1164],{"class":198}," \"all workers reached the latch",[35,1166,368],{"class":277},[35,1168,1047],{"class":198},[35,1170,256],{"class":45},[35,1172,1173],{"class":37,"line":489},[35,1174,235],{"emptyLinePlaceholder":234},[35,1176,1177,1179,1181,1183],{"class":37,"line":494},[35,1178,497],{"class":194},[35,1180,500],{"class":45},[35,1182,567],{"class":194},[35,1184,570],{"class":45},[35,1186,1187],{"class":37,"line":531},[35,1188,534],{"class":45},[35,1190,1191,1193,1195],{"class":37,"line":537},[35,1192,581],{"class":45},[35,1194,584],{"class":41},[35,1196,137],{"class":45},[35,1198,1199],{"class":37,"line":549},[35,1200,552],{"class":45},[35,1202,1203],{"class":37,"line":555},[35,1204,444],{"class":45},[10,1206,1207],{},"这里：",[26,1209,1210],{"className":28,"code":932,"language":30,"meta":31,"style":31},[14,1211,1212],{"__ignoreMap":31},[35,1213,1214,1216,1218],{"class":37,"line":38},[35,1215,921],{"class":45},[35,1217,941],{"class":41},[35,1219,137],{"class":45},[10,1221,1222],{},"只关心“3 个参与者是否都已经完成某个阶段”。",[109,1224,1226,1227,17,1230,17,1233],{"id":1225},"_9-count_downwaitarrive_and_wait","9. ",[14,1228,1229],{},"count_down()",[14,1231,1232],{},"wait()",[14,1234,1235],{},"arrive_and_wait()",[10,1237,1238],{},"常见操作：",[26,1240,1242],{"className":28,"code":1241,"language":30,"meta":31,"style":31},"latch.count_down();\nlatch.wait();\nlatch.arrive_and_wait();\n",[14,1243,1244,1253,1261],{"__ignoreMap":31},[35,1245,1246,1249,1251],{"class":37,"line":38},[35,1247,1248],{"class":45},"latch.",[35,1250,924],{"class":41},[35,1252,137],{"class":45},[35,1254,1255,1257,1259],{"class":37,"line":49},[35,1256,1248],{"class":45},[35,1258,941],{"class":41},[35,1260,137],{"class":45},[35,1262,1263,1265,1268],{"class":37,"line":57},[35,1264,1248],{"class":45},[35,1266,1267],{"class":41},"arrive_and_wait",[35,1269,137],{"class":45},[10,1271,1272,1274],{},[14,1273,1235],{}," 可以理解为：",[26,1276,1279],{"className":1277,"code":1278,"language":146,"meta":31},[144],"我已经到达\n计数减一\n然后我也等待其他参与者\n",[14,1280,1278],{"__ignoreMap":31},[109,1282,1284],{"id":1283},"_10-latch-只能使用一次","10. latch 只能使用一次",[10,1286,1287,1288,1290,1291,1293],{},"这是 ",[14,1289,97],{}," 和 ",[14,1292,103],{}," 最关键的区别。",[10,1295,1296],{},"一旦 latch 的计数变为 0：",[26,1298,1301],{"className":1299,"code":1300,"language":146,"meta":31},[144],"它不会重新恢复到初始值\n",[14,1302,1300],{"__ignoreMap":31},[10,1304,1305],{},"所以它适合：",[79,1307,1308,1311,1314],{},[82,1309,1310],{},"等待多个初始化任务完成；",[82,1312,1313],{},"等待一组 worker 启动就绪；",[82,1315,1316],{},"等待一次性并行任务全部结束。",[10,1318,1319,1320,1323],{},"如果程序需要一轮又一轮地同步，应使用 ",[14,1321,1322],{},"std::barrier","。",[109,1325,1327,1328],{"id":1326},"_11-stdbarrier","11. ",[14,1329,1322],{},[10,1331,1332,1334],{},[14,1333,1322],{}," 是可重复使用的阶段同步点。",[10,1336,1337],{},"假设有 3 个线程，每一轮都必须：",[26,1339,1342],{"className":1340,"code":1341,"language":146,"meta":31},[144],"阶段 1 全部完成\n      ↓\n所有线程才能进入阶段 2\n      ↓\n阶段 2 全部完成\n      ↓\n所有线程才能进入阶段 3\n",[14,1343,1341],{"__ignoreMap":31},[10,1345,1346],{},"这种场景非常适合 barrier。",[109,1348,1350],{"id":1349},"_12-barrier-示例","12. barrier 示例",[26,1352,1354],{"className":28,"code":1353,"language":30,"meta":31,"style":31},"#include \u003Cbarrier>\n#include \u003Ciostream>\n#include \u003Cthread>\n#include \u003Cvector>\n\nstd::barrier sync_point(3);\n\nvoid worker(int id)\n{\n    std::cout \u003C\u003C \"phase 1: \" \u003C\u003C id \u003C\u003C '\\n';\n    sync_point.arrive_and_wait();\n\n    std::cout \u003C\u003C \"phase 2: \" \u003C\u003C id \u003C\u003C '\\n';\n    sync_point.arrive_and_wait();\n\n    std::cout \u003C\u003C \"phase 3: \" \u003C\u003C id \u003C\u003C '\\n';\n}\n\nint main()\n{\n    std::vector\u003Cstd::thread> threads;\n\n    for (int i = 0; i \u003C 3; ++i)\n    {\n        threads.emplace_back(worker, i);\n    }\n\n    for (auto& thread : threads)\n    {\n        thread.join();\n    }\n}\n",[14,1355,1356,1363,1369,1375,1381,1385,1402,1406,1420,1424,1449,1458,1462,1487,1495,1499,1524,1528,1532,1540,1544,1560,1564,1590,1594,1602,1606,1610,1620,1624,1632,1636],{"__ignoreMap":31},[35,1357,1358,1360],{"class":37,"line":38},[35,1359,195],{"class":194},[35,1361,1362],{"class":198}," \u003Cbarrier>\n",[35,1364,1365,1367],{"class":37,"line":49},[35,1366,195],{"class":194},[35,1368,206],{"class":198},[35,1370,1371,1373],{"class":37,"line":57},[35,1372,195],{"class":194},[35,1374,220],{"class":198},[35,1376,1377,1379],{"class":37,"line":65},[35,1378,195],{"class":194},[35,1380,228],{"class":198},[35,1382,1383],{"class":37,"line":223},[35,1384,235],{"emptyLinePlaceholder":234},[35,1386,1387,1389,1391,1393,1396,1398,1400],{"class":37,"line":231},[35,1388,42],{"class":41},[35,1390,250],{"class":45},[35,1392,103],{"class":41},[35,1394,1395],{"class":41}," sync_point",[35,1397,287],{"class":45},[35,1399,630],{"class":277},[35,1401,292],{"class":45},[35,1403,1404],{"class":37,"line":238},[35,1405,235],{"emptyLinePlaceholder":234},[35,1407,1408,1410,1412,1414,1416,1418],{"class":37,"line":259},[35,1409,303],{"class":194},[35,1411,306],{"class":41},[35,1413,287],{"class":45},[35,1415,311],{"class":194},[35,1417,315],{"class":314},[35,1419,318],{"class":45},[35,1421,1422],{"class":37,"line":264},[35,1423,324],{"class":45},[35,1425,1426,1428,1430,1432,1435,1437,1439,1441,1443,1445,1447],{"class":37,"line":295},[35,1427,345],{"class":41},[35,1429,348],{"class":45},[35,1431,351],{"class":194},[35,1433,1434],{"class":198}," \"phase 1: \"",[35,1436,357],{"class":194},[35,1438,360],{"class":45},[35,1440,351],{"class":194},[35,1442,365],{"class":198},[35,1444,368],{"class":277},[35,1446,371],{"class":198},[35,1448,256],{"class":45},[35,1450,1451,1454,1456],{"class":37,"line":300},[35,1452,1453],{"class":45},"    sync_point.",[35,1455,1267],{"class":41},[35,1457,137],{"class":45},[35,1459,1460],{"class":37,"line":321},[35,1461,235],{"emptyLinePlaceholder":234},[35,1463,1464,1466,1468,1470,1473,1475,1477,1479,1481,1483,1485],{"class":37,"line":327},[35,1465,345],{"class":41},[35,1467,348],{"class":45},[35,1469,351],{"class":194},[35,1471,1472],{"class":198}," \"phase 2: \"",[35,1474,357],{"class":194},[35,1476,360],{"class":45},[35,1478,351],{"class":194},[35,1480,365],{"class":198},[35,1482,368],{"class":277},[35,1484,371],{"class":198},[35,1486,256],{"class":45},[35,1488,1489,1491,1493],{"class":37,"line":337},[35,1490,1453],{"class":45},[35,1492,1267],{"class":41},[35,1494,137],{"class":45},[35,1496,1497],{"class":37,"line":342},[35,1498,235],{"emptyLinePlaceholder":234},[35,1500,1501,1503,1505,1507,1510,1512,1514,1516,1518,1520,1522],{"class":37,"line":376},[35,1502,345],{"class":41},[35,1504,348],{"class":45},[35,1506,351],{"class":194},[35,1508,1509],{"class":198}," \"phase 3: \"",[35,1511,357],{"class":194},[35,1513,360],{"class":45},[35,1515,351],{"class":194},[35,1517,365],{"class":198},[35,1519,368],{"class":277},[35,1521,371],{"class":198},[35,1523,256],{"class":45},[35,1525,1526],{"class":37,"line":401},[35,1527,444],{"class":45},[35,1529,1530],{"class":37,"line":427},[35,1531,235],{"emptyLinePlaceholder":234},[35,1533,1534,1536,1538],{"class":37,"line":432},[35,1535,311],{"class":194},[35,1537,457],{"class":41},[35,1539,460],{"class":45},[35,1541,1542],{"class":37,"line":441},[35,1543,324],{"class":45},[35,1545,1546,1548,1550,1552,1554,1556,1558],{"class":37,"line":447},[35,1547,345],{"class":41},[35,1549,473],{"class":45},[35,1551,274],{"class":194},[35,1553,42],{"class":41},[35,1555,480],{"class":45},[35,1557,483],{"class":194},[35,1559,486],{"class":45},[35,1561,1562],{"class":37,"line":452},[35,1563,235],{"emptyLinePlaceholder":234},[35,1565,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588],{"class":37,"line":463},[35,1567,497],{"class":194},[35,1569,500],{"class":45},[35,1571,311],{"class":194},[35,1573,505],{"class":45},[35,1575,508],{"class":194},[35,1577,511],{"class":277},[35,1579,514],{"class":45},[35,1581,274],{"class":194},[35,1583,1119],{"class":277},[35,1585,522],{"class":45},[35,1587,525],{"class":194},[35,1589,528],{"class":45},[35,1591,1592],{"class":37,"line":468},[35,1593,534],{"class":45},[35,1595,1596,1598,1600],{"class":37,"line":489},[35,1597,540],{"class":45},[35,1599,543],{"class":41},[35,1601,546],{"class":45},[35,1603,1604],{"class":37,"line":494},[35,1605,552],{"class":45},[35,1607,1608],{"class":37,"line":531},[35,1609,235],{"emptyLinePlaceholder":234},[35,1611,1612,1614,1616,1618],{"class":37,"line":537},[35,1613,497],{"class":194},[35,1615,500],{"class":45},[35,1617,567],{"class":194},[35,1619,570],{"class":45},[35,1621,1622],{"class":37,"line":549},[35,1623,534],{"class":45},[35,1625,1626,1628,1630],{"class":37,"line":555},[35,1627,581],{"class":45},[35,1629,584],{"class":41},[35,1631,137],{"class":45},[35,1633,1634],{"class":37,"line":560},[35,1635,552],{"class":45},[35,1637,1638],{"class":37,"line":573},[35,1639,444],{"class":45},[10,1641,1642],{},"虽然每个阶段内部的打印顺序仍然不确定，但不会有某个线程提前跨过同步点进入下一阶段，而其他线程还没有完成上一阶段。",[109,1644,1646],{"id":1645},"_13-barrier-会自动开始下一轮","13. barrier 会自动开始下一轮",[10,1648,1649],{},"当本轮所有参与者到达后，barrier 会完成当前阶段，然后自动为下一阶段重新准备。",[10,1651,1652],{},"这正是它与 latch 的不同：",[26,1654,1657],{"className":1655,"code":1656,"language":146,"meta":31},[144],"latch\n一次性\n\nbarrier\n可重复阶段同步\n",[14,1658,1656],{"__ignoreMap":31},[109,1660,1662],{"id":1661},"_14-completion-function","14. completion function",[10,1664,1665,1667],{},[14,1666,1322],{}," 还可以在每一阶段全部参与者到达后执行一个完成函数。",[10,1669,1670],{},"概念上：",[26,1672,1675],{"className":1673,"code":1674,"language":146,"meta":31},[144],"所有线程到达 barrier\n        ↓\n执行 completion function\n        ↓\n进入下一阶段\n",[14,1676,1674],{"__ignoreMap":31},[10,1678,1679],{},"这适合每轮结束都需要统一做一次状态更新的算法。",[10,1681,1682],{},"使用这个功能时应确保 completion function 本身不会引入新的复杂阻塞或锁依赖。",[109,1684,1686,1687],{"id":1685},"_15-arrive_and_drop","15. ",[14,1688,1689],{},"arrive_and_drop()",[10,1691,1692],{},"如果某个参与者之后不再参加后续阶段，可以调用：",[26,1694,1696],{"className":28,"code":1695,"language":30,"meta":31,"style":31},"barrier.arrive_and_drop();\n",[14,1697,1698],{"__ignoreMap":31},[35,1699,1700,1703,1706],{"class":37,"line":38},[35,1701,1702],{"class":45},"barrier.",[35,1704,1705],{"class":41},"arrive_and_drop",[35,1707,137],{"class":45},[10,1709,1710],{},"表示：",[826,1712,1713],{},[10,1714,1715],{},"我完成本轮到达，并且从以后各轮的参与者数量中永久退出。",[10,1717,1718],{},"这和简单离开线程不同，因为 barrier 必须知道未来还应该等待多少参与者。",[109,1720,1722],{"id":1721},"_16-三种工具怎么选","16. 三种工具怎么选",[1724,1725,1726,1740],"table",{},[1727,1728,1729],"thead",{},[1730,1731,1732,1737],"tr",{},[1733,1734,1736],"th",{"align":1735},"left","问题",[1733,1738,1739],{"align":1735},"推荐工具",[1741,1742,1743,1753,1762,1771,1780,1789],"tbody",{},[1730,1744,1745,1749],{},[1746,1747,1748],"td",{"align":1735},"最多允许 N 个线程同时访问资源",[1746,1750,1751],{"align":1735},[14,1752,271],{},[1730,1754,1755,1758],{},[1746,1756,1757],{"align":1735},"一个线程给另一个线程发一个简单许可",[1746,1759,1760],{"align":1735},[14,1761,775],{},[1730,1763,1764,1767],{},[1746,1765,1766],{"align":1735},"等待 N 个一次性任务全部到达",[1746,1768,1769],{"align":1735},[14,1770,97],{},[1730,1772,1773,1776],{},[1746,1774,1775],{"align":1735},"多个线程每一轮都要在阶段边界会合",[1746,1777,1778],{"align":1735},[14,1779,103],{},[1730,1781,1782,1785],{},[1746,1783,1784],{"align":1735},"保护共享对象的一致性",[1746,1786,1787],{"align":1735},[14,1788,76],{},[1730,1790,1791,1794],{},[1746,1792,1793],{"align":1735},"等待复杂谓词条件",[1746,1795,1796],{"align":1735},[14,1797,1798],{},"condition_variable",[109,1800,1802],{"id":1801},"_17-和-condition_variable-的关系","17. 和 condition_variable 的关系",[10,1804,1805],{},"这些工具很多都可以用：",[26,1807,1810],{"className":1808,"code":1809,"language":146,"meta":31},[144],"mutex + condition_variable + counter\n",[14,1811,1809],{"__ignoreMap":31},[10,1813,1814],{},"手工实现。",[10,1816,1817],{},"例如 latch 本质上就是一种：",[26,1819,1822],{"className":1820,"code":1821,"language":146,"meta":31},[144],"计数递减到 0 后唤醒等待者\n",[14,1823,1821],{"__ignoreMap":31},[10,1825,1826],{},"的同步模式。",[10,1828,1829],{},"但既然 C++20 已经提供标准抽象，就不必每次重新发明一套状态变量和通知协议。",[10,1831,1832],{},"标准工具的优势是：",[79,1834,1835,1838,1841,1844],{},[82,1836,1837],{},"意图更明确；",[82,1839,1840],{},"代码更短；",[82,1842,1843],{},"更不容易写错边界条件；",[82,1845,1846],{},"阅读代码的人一眼能看出同步模式。",[109,1848,1850],{"id":1849},"_18-常见错误","18. 常见错误",[1852,1853,1854,1857,1867,1870,1876,1879,1885],"ol",{},[82,1855,1856],{},"把 semaphore 当成 mutex，误以为它自动保护共享对象。",[82,1858,1859,1862,1863,1866],{},[14,1860,1861],{},"acquire()"," 后忘记 ",[14,1864,1865],{},"release()","，导致许可永久减少。",[82,1868,1869],{},"认为 binary semaphore 具有 mutex 一样严格的线程所有权语义。",[82,1871,1872,1873,1875],{},"把一次性的 ",[14,1874,97],{}," 当成可以重置循环使用的同步器。",[82,1877,1878],{},"barrier 的参与者数量设计错误，导致永远等不到所有参与者。",[82,1880,1881,1882,1884],{},"某个线程提前退出，却没有用 ",[14,1883,1689],{}," 调整 barrier 后续参与数量。",[82,1886,1887],{},"在 completion function 中执行复杂阻塞操作，让所有参与者都卡在阶段边界。",[109,1889,1890],{"id":1890},"小结",[79,1892,1893,1898,1903,1908,1912,1915],{},[82,1894,1895,1897],{},[14,1896,271],{}," 用计数控制可同时获得的许可数量。",[82,1899,1900,1902],{},[14,1901,775],{}," 是计数最多为 1 的信号量语义。",[82,1904,1905,1907],{},[14,1906,97],{}," 是一次性倒计时同步点，计数归零后永久打开。",[82,1909,1910,1334],{},[14,1911,103],{},[82,1913,1914],{},"这些工具解决的是同步模式，不直接替代 mutex 对共享状态的保护。",[82,1916,1917],{},"C++20 项目遇到对应模式时，优先考虑标准同步原语，而不是手写复杂条件变量计数器。",[1919,1920,1921],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .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":31,"searchDepth":49,"depth":49,"links":1923},[1924,1926,1927,1928,1930,1932,1933,1935,1936,1938,1939,1941,1942,1943,1944,1946,1947,1948,1949],{"id":111,"depth":49,"text":1925},"1. std::counting_semaphore",{"id":180,"depth":49,"text":181},{"id":602,"depth":49,"text":603},{"id":659,"depth":49,"text":1929},"4. try_acquire()",{"id":737,"depth":49,"text":1931},"5. std::binary_semaphore",{"id":833,"depth":49,"text":834},{"id":874,"depth":49,"text":1934},"7. std::latch",{"id":949,"depth":49,"text":950},{"id":1225,"depth":49,"text":1937},"9. count_down()、wait()、arrive_and_wait()",{"id":1283,"depth":49,"text":1284},{"id":1326,"depth":49,"text":1940},"11. std::barrier",{"id":1349,"depth":49,"text":1350},{"id":1645,"depth":49,"text":1646},{"id":1661,"depth":49,"text":1662},{"id":1685,"depth":49,"text":1945},"15. arrive_and_drop()",{"id":1721,"depth":49,"text":1722},{"id":1801,"depth":49,"text":1802},{"id":1849,"depth":49,"text":1850},{"id":1890,"depth":49,"text":1890},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","2000-1900-0700","2023-10-05","C++20 在 \u003Csemaphore>、\u003Clatch>、\u003Cbarrier> 中加入了三类更高层的同步工具：","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier",false,null,"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-CN","zh-cn",{},{"title":5,"description":1953},"xDJX95QG4dTgiiXU0xwUDvA5pgPMOCNFiVWiLZ9SsyM",[1969,1975,1980,1985,1990,1995,2000,2005,2010,2015,2020,2025,2030,2035,2040,2045,2050,2055,2060,2065,2070,2075,2080,2085,2090,2095,2100,2105,2110,2115,2120,2125,2130,2135,2140,2145,2150,2155,2160,2165,2170,2175,2179,2184,2189,2194,2199,2204,2209,2214,2219,2224,2229,2234,2239,2244,2249,2254,2259,2264,2269,2273,2278,2283,2284,2289,2294,2299,2304,2309,2314,2319,2324,2329,2334,2339,2344,2349,2354,2359,2364,2369,2374,2379,2384,2389,2394],{"path":1970,"stem":1971,"title":1972,"date":1952,"chapterOrder":1973,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试","0100",0,{"path":1976,"stem":1977,"title":1978,"date":1952,"chapterOrder":1979,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":1981,"stem":1982,"title":1983,"date":1952,"chapterOrder":1984,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":1986,"stem":1987,"title":1988,"date":1952,"chapterOrder":1989,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":1991,"stem":1992,"title":1993,"date":1952,"chapterOrder":1994,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":1996,"stem":1997,"title":1998,"date":1952,"chapterOrder":1999,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":2001,"stem":2002,"title":2003,"date":1952,"chapterOrder":2004,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":2006,"stem":2007,"title":2008,"date":1952,"chapterOrder":2009,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":2011,"stem":2012,"title":2013,"date":1952,"chapterOrder":2014,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":2016,"stem":2017,"title":2018,"date":1952,"chapterOrder":2019,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":2021,"stem":2022,"title":2023,"date":1952,"chapterOrder":2024,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":2026,"stem":2027,"title":2028,"date":1952,"chapterOrder":2029,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":2031,"stem":2032,"title":2033,"date":1952,"chapterOrder":2034,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高","1300",{"path":2036,"stem":2037,"title":2038,"date":1952,"chapterOrder":2039,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间","1350",{"path":2041,"stem":2042,"title":2043,"date":1952,"chapterOrder":2044,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":2046,"stem":2047,"title":2048,"date":1952,"chapterOrder":2049,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":2051,"stem":2052,"title":2053,"date":1952,"chapterOrder":2054,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针","1400-0300",{"path":2056,"stem":2057,"title":2058,"date":1952,"chapterOrder":2059,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":2061,"stem":2062,"title":2063,"date":1952,"chapterOrder":2064,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":2066,"stem":2067,"title":2068,"date":1952,"chapterOrder":2069,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":2071,"stem":2072,"title":2073,"date":1952,"chapterOrder":2074,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":2076,"stem":2077,"title":2078,"date":1952,"chapterOrder":2079,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针","1450",{"path":2081,"stem":2082,"title":2083,"date":1952,"chapterOrder":2084,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":2086,"stem":2087,"title":2088,"date":1952,"chapterOrder":2089,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":2091,"stem":2092,"title":2093,"date":1952,"chapterOrder":2094,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":2096,"stem":2097,"title":2098,"date":1952,"chapterOrder":2099,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":2101,"stem":2102,"title":2103,"date":1952,"chapterOrder":2104,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":2106,"stem":2107,"title":2108,"date":1952,"chapterOrder":2109,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":2111,"stem":2112,"title":2113,"date":1952,"chapterOrder":2114,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":2116,"stem":2117,"title":2118,"date":1952,"chapterOrder":2119,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":2121,"stem":2122,"title":2123,"date":1952,"chapterOrder":2124,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":2126,"stem":2127,"title":2128,"date":1952,"chapterOrder":2129,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":2131,"stem":2132,"title":2133,"date":1952,"chapterOrder":2134,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":2136,"stem":2137,"title":2138,"date":1952,"chapterOrder":2139,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":2141,"stem":2142,"title":2143,"date":1952,"chapterOrder":2144,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":2146,"stem":2147,"title":2148,"date":1952,"chapterOrder":2149,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词","1800-1100",{"path":2151,"stem":2152,"title":2153,"date":1952,"chapterOrder":2154,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":2156,"stem":2157,"title":2158,"date":1952,"chapterOrder":2159,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":2161,"stem":2162,"title":2163,"date":1952,"chapterOrder":2164,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":2166,"stem":2167,"title":2168,"date":1952,"chapterOrder":2169,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":2171,"stem":2172,"title":2173,"date":1952,"chapterOrder":2174,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":2176,"stem":2177,"title":241,"date":1952,"chapterOrder":2178,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":2180,"stem":2181,"title":2182,"date":1952,"chapterOrder":2183,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":2185,"stem":2186,"title":2187,"date":1952,"chapterOrder":2188,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":2190,"stem":2191,"title":2192,"date":1952,"chapterOrder":2193,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":2195,"stem":2196,"title":2197,"date":1952,"chapterOrder":2198,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":2200,"stem":2201,"title":2202,"date":1952,"chapterOrder":2203,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":2205,"stem":2206,"title":2207,"date":1952,"chapterOrder":2208,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":2210,"stem":2211,"title":2212,"date":1952,"chapterOrder":2213,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义","2000-1000",{"path":2215,"stem":2216,"title":2217,"date":1952,"chapterOrder":2218,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":2220,"stem":2221,"title":2222,"date":1952,"chapterOrder":2223,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":2225,"stem":2226,"title":2227,"date":1952,"chapterOrder":2228,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":2230,"stem":2231,"title":2232,"date":1952,"chapterOrder":2233,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":2235,"stem":2236,"title":2237,"date":1952,"chapterOrder":2238,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":2240,"stem":2241,"title":2242,"date":1952,"chapterOrder":2243,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":2245,"stem":2246,"title":2247,"date":1952,"chapterOrder":2248,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":2250,"stem":2251,"title":2252,"date":1952,"chapterOrder":2253,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":2255,"stem":2256,"title":2257,"date":1952,"chapterOrder":2258,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread","2000-1900-0100",{"path":2260,"stem":2261,"title":2262,"date":1952,"chapterOrder":2263,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 RAII 锁","2000-1900-0200",{"path":2265,"stem":2266,"title":2267,"date":1952,"chapterOrder":2268,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":2270,"stem":2271,"title":1798,"date":1952,"chapterOrder":2272,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","2000-1900-0400",{"path":2274,"stem":2275,"title":2276,"date":1952,"chapterOrder":2277,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise","future、async、promise 与 packaged_task","2000-1900-0500",{"path":2279,"stem":2280,"title":2281,"date":1952,"chapterOrder":2282,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0600-jthread-stop-token","jthread 与 stop_token","2000-1900-0600",{"path":1950,"stem":1959,"title":5,"date":1952,"chapterOrder":1951,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},{"path":2285,"stem":2286,"title":2287,"date":1952,"chapterOrder":2288,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":2290,"stem":2291,"title":2292,"date":1952,"chapterOrder":2293,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":2295,"stem":2296,"title":2297,"date":1952,"chapterOrder":2298,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":2300,"stem":2301,"title":2302,"date":1952,"chapterOrder":2303,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":2305,"stem":2306,"title":2307,"date":1952,"chapterOrder":2308,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO","2100-0100-0100",{"path":2310,"stem":2311,"title":2312,"date":1952,"chapterOrder":2313,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础","2100-0100-0200",{"path":2315,"stem":2316,"title":2317,"date":1952,"chapterOrder":2318,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":2320,"stem":2321,"title":2322,"date":1952,"chapterOrder":2323,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":2325,"stem":2326,"title":2327,"date":1952,"chapterOrder":2328,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":2330,"stem":2331,"title":2332,"date":1952,"chapterOrder":2333,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","2100-0100-0600",{"path":2335,"stem":2336,"title":2337,"date":1952,"chapterOrder":2338,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库","2100-0100",{"path":2340,"stem":2341,"title":2342,"date":1952,"chapterOrder":2343,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":2345,"stem":2346,"title":2347,"date":1952,"chapterOrder":2348,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库","2100-0300",{"path":2350,"stem":2351,"title":2352,"date":1952,"chapterOrder":2353,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":2355,"stem":2356,"title":2357,"date":1952,"chapterOrder":2358,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库","2100-0500",{"path":2360,"stem":2361,"title":2362,"date":1952,"chapterOrder":2363,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":2365,"stem":2366,"title":2367,"date":1952,"chapterOrder":2368,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":2370,"stem":2371,"title":2372,"date":1952,"chapterOrder":2373,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项","2200-0200",{"path":2375,"stem":2376,"title":2377,"date":1952,"chapterOrder":2378,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解","2200-0300",{"path":2380,"stem":2381,"title":2382,"date":1952,"chapterOrder":2383,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":2385,"stem":2386,"title":2387,"date":1952,"chapterOrder":2388,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":2390,"stem":2391,"title":2392,"date":1952,"chapterOrder":2393,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":1956,"stem":2395,"title":2396,"date":1952,"chapterOrder":1961,"chapterDepth":1974,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":234},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":2398},[2399,2402,2405,2408,2411],{"path":2400,"localeSlug":2401,"i18nKey":1959},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","en-us",{"path":2403,"localeSlug":2404,"i18nKey":1959},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-hant",{"path":2406,"localeSlug":2407,"i18nKey":1959},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-hk",{"path":2409,"localeSlug":2410,"i18nKey":1959},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-tw",{"path":1950,"localeSlug":1964,"i18nKey":1959},[2400,1962,2403,1962,2406,1962,2409,1962,1950,1962],1789140816151]