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