[{"data":1,"prerenderedAt":2414},["ShallowReactive",2],{"wiki-page-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":3,"wiki-doc-items-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":1969,"language-switcher-data-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":2398,"wiki-i18n-paths-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier":2413},{"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":1961,"locale":1962,"localeSlug":1963,"meta":1964,"navigation":234,"path":1950,"seo":1965,"sourcePath":1966,"sourceStem":1959,"stem":1967,"wikiDepth":38,"__hash__":1968},"content\u002F_i18n\u002Fzh-tw\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-tw\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-tw:2023-10-05-cplusplus-jiao-xue","\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier",false,null,"zh-TW","zh-tw",{},{"title":5,"description":1953},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier","6lAFXr733uZ2IkNCi6Bh9lsInI_T4ZijnWg87tlVsA4",[1970,1976,1981,1986,1991,1996,2001,2006,2011,2016,2021,2026,2031,2036,2041,2046,2051,2056,2061,2066,2071,2076,2081,2086,2091,2096,2101,2106,2111,2116,2121,2126,2131,2136,2141,2146,2151,2156,2161,2166,2171,2176,2180,2185,2190,2195,2200,2205,2210,2215,2220,2225,2230,2235,2240,2245,2250,2255,2260,2265,2270,2274,2279,2284,2285,2290,2295,2300,2305,2310,2315,2320,2325,2330,2335,2340,2345,2350,2355,2360,2365,2370,2375,2380,2385,2390,2395],{"path":1971,"stem":1972,"title":1973,"date":1952,"chapterOrder":1974,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":1977,"stem":1978,"title":1979,"date":1952,"chapterOrder":1980,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":1982,"stem":1983,"title":1984,"date":1952,"chapterOrder":1985,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":1987,"stem":1988,"title":1989,"date":1952,"chapterOrder":1990,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":1992,"stem":1993,"title":1994,"date":1952,"chapterOrder":1995,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":1997,"stem":1998,"title":1999,"date":1952,"chapterOrder":2000,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":2002,"stem":2003,"title":2004,"date":1952,"chapterOrder":2005,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":2007,"stem":2008,"title":2009,"date":1952,"chapterOrder":2010,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":2012,"stem":2013,"title":2014,"date":1952,"chapterOrder":2015,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":2017,"stem":2018,"title":2019,"date":1952,"chapterOrder":2020,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":2022,"stem":2023,"title":2024,"date":1952,"chapterOrder":2025,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":2027,"stem":2028,"title":2029,"date":1952,"chapterOrder":2030,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":2032,"stem":2033,"title":2034,"date":1952,"chapterOrder":2035,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函數提高","1300",{"path":2037,"stem":2038,"title":2039,"date":1952,"chapterOrder":2040,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空間","1350",{"path":2042,"stem":2043,"title":2044,"date":1952,"chapterOrder":2045,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":2047,"stem":2048,"title":2049,"date":1952,"chapterOrder":2050,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":2052,"stem":2053,"title":2054,"date":1952,"chapterOrder":2055,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":2057,"stem":2058,"title":2059,"date":1952,"chapterOrder":2060,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":2062,"stem":2063,"title":2064,"date":1952,"chapterOrder":2065,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":2067,"stem":2068,"title":2069,"date":1952,"chapterOrder":2070,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":2072,"stem":2073,"title":2074,"date":1952,"chapterOrder":2075,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":2077,"stem":2078,"title":2079,"date":1952,"chapterOrder":2080,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函數指針","1450",{"path":2082,"stem":2083,"title":2084,"date":1952,"chapterOrder":2085,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":2087,"stem":2088,"title":2089,"date":1952,"chapterOrder":2090,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":2092,"stem":2093,"title":2094,"date":1952,"chapterOrder":2095,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":2097,"stem":2098,"title":2099,"date":1952,"chapterOrder":2100,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":2102,"stem":2103,"title":2104,"date":1952,"chapterOrder":2105,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":2107,"stem":2108,"title":2109,"date":1952,"chapterOrder":2110,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":2112,"stem":2113,"title":2114,"date":1952,"chapterOrder":2115,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":2117,"stem":2118,"title":2119,"date":1952,"chapterOrder":2120,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":2122,"stem":2123,"title":2124,"date":1952,"chapterOrder":2125,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":2127,"stem":2128,"title":2129,"date":1952,"chapterOrder":2130,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":2132,"stem":2133,"title":2134,"date":1952,"chapterOrder":2135,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":2137,"stem":2138,"title":2139,"date":1952,"chapterOrder":2140,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":2142,"stem":2143,"title":2144,"date":1952,"chapterOrder":2145,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":2147,"stem":2148,"title":2149,"date":1952,"chapterOrder":2150,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":2152,"stem":2153,"title":2154,"date":1952,"chapterOrder":2155,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":2157,"stem":2158,"title":2159,"date":1952,"chapterOrder":2160,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":2162,"stem":2163,"title":2164,"date":1952,"chapterOrder":2165,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":2167,"stem":2168,"title":2169,"date":1952,"chapterOrder":2170,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":2172,"stem":2173,"title":2174,"date":1952,"chapterOrder":2175,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":2177,"stem":2178,"title":241,"date":1952,"chapterOrder":2179,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":2181,"stem":2182,"title":2183,"date":1952,"chapterOrder":2184,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":2186,"stem":2187,"title":2188,"date":1952,"chapterOrder":2189,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":2191,"stem":2192,"title":2193,"date":1952,"chapterOrder":2194,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":2196,"stem":2197,"title":2198,"date":1952,"chapterOrder":2199,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":2201,"stem":2202,"title":2203,"date":1952,"chapterOrder":2204,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":2206,"stem":2207,"title":2208,"date":1952,"chapterOrder":2209,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":2211,"stem":2212,"title":2213,"date":1952,"chapterOrder":2214,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":2216,"stem":2217,"title":2218,"date":1952,"chapterOrder":2219,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":2221,"stem":2222,"title":2223,"date":1952,"chapterOrder":2224,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":2226,"stem":2227,"title":2228,"date":1952,"chapterOrder":2229,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":2231,"stem":2232,"title":2233,"date":1952,"chapterOrder":2234,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":2236,"stem":2237,"title":2238,"date":1952,"chapterOrder":2239,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":2241,"stem":2242,"title":2243,"date":1952,"chapterOrder":2244,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":2246,"stem":2247,"title":2248,"date":1952,"chapterOrder":2249,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":2251,"stem":2252,"title":2253,"date":1952,"chapterOrder":2254,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":2256,"stem":2257,"title":2258,"date":1952,"chapterOrder":2259,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread","2000-1900-0100",{"path":2261,"stem":2262,"title":2263,"date":1952,"chapterOrder":2264,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 RAII 鎖","2000-1900-0200",{"path":2266,"stem":2267,"title":2268,"date":1952,"chapterOrder":2269,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":2271,"stem":2272,"title":1798,"date":1952,"chapterOrder":2273,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","2000-1900-0400",{"path":2275,"stem":2276,"title":2277,"date":1952,"chapterOrder":2278,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise","future、async、promise 與 packaged_task","2000-1900-0500",{"path":2280,"stem":2281,"title":2282,"date":1952,"chapterOrder":2283,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0600-jthread-stop-token","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0600-jthread-stop-token","jthread 與 stop_token","2000-1900-0600",{"path":1950,"stem":1967,"title":5,"date":1952,"chapterOrder":1951,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},{"path":2286,"stem":2287,"title":2288,"date":1952,"chapterOrder":2289,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":2291,"stem":2292,"title":2293,"date":1952,"chapterOrder":2294,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":2296,"stem":2297,"title":2298,"date":1952,"chapterOrder":2299,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":2301,"stem":2302,"title":2303,"date":1952,"chapterOrder":2304,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":2306,"stem":2307,"title":2308,"date":1952,"chapterOrder":2309,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":2311,"stem":2312,"title":2313,"date":1952,"chapterOrder":2314,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":2316,"stem":2317,"title":2318,"date":1952,"chapterOrder":2319,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":2321,"stem":2322,"title":2323,"date":1952,"chapterOrder":2324,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":2326,"stem":2327,"title":2328,"date":1952,"chapterOrder":2329,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":2331,"stem":2332,"title":2333,"date":1952,"chapterOrder":2334,"chapterDepth":49,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":2336,"stem":2337,"title":2338,"date":1952,"chapterOrder":2339,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":2341,"stem":2342,"title":2343,"date":1952,"chapterOrder":2344,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":2346,"stem":2347,"title":2348,"date":1952,"chapterOrder":2349,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":2351,"stem":2352,"title":2353,"date":1952,"chapterOrder":2354,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":2356,"stem":2357,"title":2358,"date":1952,"chapterOrder":2359,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代數庫","2100-0500",{"path":2361,"stem":2362,"title":2363,"date":1952,"chapterOrder":2364,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":2366,"stem":2367,"title":2368,"date":1952,"chapterOrder":2369,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":2371,"stem":2372,"title":2373,"date":1952,"chapterOrder":2374,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":2376,"stem":2377,"title":2378,"date":1952,"chapterOrder":2379,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src與lib模塊CMake詳解","2200-0300",{"path":2381,"stem":2382,"title":2383,"date":1952,"chapterOrder":2384,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":2386,"stem":2387,"title":2388,"date":1952,"chapterOrder":2389,"chapterDepth":38,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":2391,"stem":2392,"title":2393,"date":1952,"chapterOrder":2394,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":1960},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":1956,"stem":2396,"title":2397,"date":1952,"chapterOrder":1961,"chapterDepth":1975,"docKey":1955,"docRoot":1956,"docTitle":1957,"isWikiDoc":234,"isWikiIndex":234},"_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":2399},[2400,2403,2406,2409,2410],{"path":2401,"localeSlug":2402,"i18nKey":1959},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","en-us",{"path":2404,"localeSlug":2405,"i18nKey":1959},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-hant",{"path":2407,"localeSlug":2408,"i18nKey":1959},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-hk",{"path":1950,"localeSlug":1963,"i18nKey":1959},{"path":2411,"localeSlug":2412,"i18nKey":1959},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","zh-cn",[2401,1966,2404,1966,2407,1966,1950,1966,2411,1966],1789198779721]