[{"data":1,"prerenderedAt":1714},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable":1284,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable":1698,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable":1713},{"id":4,"title":5,"body":6,"canonicalPath":1266,"chapter":1267,"chapterSort":1268,"date":1269,"description":49,"docI18nKey":1270,"docKey":1271,"docRoot":1272,"docTitle":1273,"extension":1274,"i18nKey":1275,"isBlogPost":1276,"isWikiDoc":110,"isWikiIndex":1276,"layout":1277,"legacyPath":1278,"locale":1279,"localeSlug":1280,"meta":1281,"navigation":110,"path":1266,"seo":1282,"sourcePath":1278,"sourceStem":1275,"stem":1275,"wikiDepth":56,"__hash__":1283},"content/wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable.md","condition_variable",{"type":7,"value":8,"toc":1257},"minimark",[9,13,21,24,35,38,43,836,843,851,857,861,870,1178,1183,1189,1192,1218,1221,1253],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16,20],"p",{},[17,18,19],"code",{},"std::condition_variable"," 用于\"一个线程等待某个条件，另一个线程改变条件后发通知\"。",[14,22,23],{},"典型例子是生产者消费者：生产者把数据放进队列，消费者没有数据时等待，有数据后被唤醒。",[14,25,26,27,30,31,34],{},"条件变量通常和 ",[17,28,29],{},"std::unique_lock\u003Cstd::mutex>"," 一起使用，因为 ",[17,32,33],{},"wait()"," 需要在等待时临时释放锁，被唤醒后再重新加锁。",[10,36,37],{"id":37},"示例代码",[39,40,42],"h3",{"id":41},"示例-1生产者消费者","示例 1：生产者消费者",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cchrono>\n#include \u003Ccondition_variable>\n#include \u003Ciostream>\n#include \u003Cmutex>\n#include \u003Cqueue>\n#include \u003Cthread>\n\nstd::queue\u003Cint> data_queue;\n// 加锁用来保护共享数据，避免多个线程同时修改造成数据竞争。\nstd::mutex queue_mutex;\nstd::condition_variable queue_cv;\nbool finished = false;\n\nvoid producer()\n{\n    for (int value = 1; value \u003C= 3; ++value)\n    {\n        {\n            std::lock_guard\u003Cstd::mutex> lock(queue_mutex);\n            data_queue.push(value);\n            std::cout \u003C\u003C \"produced \" \u003C\u003C value \u003C\u003C \"\\n\";\n        }\n\n        queue_cv.notify_one();\n        std::this_thread::sleep_for(std::chrono::milliseconds(50));\n    }\n\n    {\n        std::lock_guard\u003Cstd::mutex> lock(queue_mutex);\n        finished = true;\n    }\n    queue_cv.notify_one();\n}\n\nvoid consumer()\n{\n    while (true)\n    {\n        std::unique_lock\u003Cstd::mutex> lock(queue_mutex);\n        queue_cv.wait(lock, [] {\n            return !data_queue.empty() || finished;\n        });\n\n        while (!data_queue.empty())\n        {\n            int value = data_queue.front();\n            data_queue.pop();\n\n            lock.unlock();\n            std::cout \u003C\u003C \"consumed \" \u003C\u003C value \u003C\u003C \"\\n\";\n            lock.lock();\n        }\n\n        if (finished)\n        {\n            break;\n        }\n    }\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    // 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread p(producer);\n    std::thread c(consumer);\n\n    // join 会等待子线程结束，避免 main 提前退出。\n    p.join();\n    c.join();\n\n    std::cout \u003C\u003C \"all done\\n\";\n\n    return 0;\n}\n","cpp","",[17,51,52,65,73,81,89,97,105,112,129,136,144,152,171,176,188,194,232,238,244,270,282,314,320,325,337,377,383,388,393,412,425,430,440,446,451,461,466,480,485,505,516,540,546,551,569,574,592,602,607,618,644,654,659,664,673,678,686,691,696,701,706,716,721,727,733,747,760,765,771,782,792,797,815,820,831],{"__ignoreMap":49},[53,54,57,61],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"szBVR","#include",[53,62,64],{"class":63},"sZZnC"," \u003Cchrono>\n",[53,66,68,70],{"class":55,"line":67},2,[53,69,60],{"class":59},[53,71,72],{"class":63}," \u003Ccondition_variable>\n",[53,74,76,78],{"class":55,"line":75},3,[53,77,60],{"class":59},[53,79,80],{"class":63}," \u003Ciostream>\n",[53,82,84,86],{"class":55,"line":83},4,[53,85,60],{"class":59},[53,87,88],{"class":63}," \u003Cmutex>\n",[53,90,92,94],{"class":55,"line":91},5,[53,93,60],{"class":59},[53,95,96],{"class":63}," \u003Cqueue>\n",[53,98,100,102],{"class":55,"line":99},6,[53,101,60],{"class":59},[53,103,104],{"class":63}," \u003Cthread>\n",[53,106,108],{"class":55,"line":107},7,[53,109,111],{"emptyLinePlaceholder":110},true,"\n",[53,113,115,119,123,126],{"class":55,"line":114},8,[53,116,118],{"class":117},"sScJk","std",[53,120,122],{"class":121},"sVt8B","::queue",[53,124,125],{"class":59},"\u003Cint>",[53,127,128],{"class":121}," data_queue;\n",[53,130,132],{"class":55,"line":131},9,[53,133,135],{"class":134},"sJ8bj","// 加锁用来保护共享数据，避免多个线程同时修改造成数据竞争。\n",[53,137,139,141],{"class":55,"line":138},10,[53,140,118],{"class":117},[53,142,143],{"class":121},"::mutex queue_mutex;\n",[53,145,147,149],{"class":55,"line":146},11,[53,148,118],{"class":117},[53,150,151],{"class":121},"::condition_variable queue_cv;\n",[53,153,155,158,161,164,168],{"class":55,"line":154},12,[53,156,157],{"class":59},"bool",[53,159,160],{"class":121}," finished ",[53,162,163],{"class":59},"=",[53,165,167],{"class":166},"sj4cs"," false",[53,169,170],{"class":121},";\n",[53,172,174],{"class":55,"line":173},13,[53,175,111],{"emptyLinePlaceholder":110},[53,177,179,182,185],{"class":55,"line":178},14,[53,180,181],{"class":59},"void",[53,183,184],{"class":117}," producer",[53,186,187],{"class":121},"()\n",[53,189,191],{"class":55,"line":190},15,[53,192,193],{"class":121},"{\n",[53,195,197,200,203,206,209,211,214,217,220,223,226,229],{"class":55,"line":196},16,[53,198,199],{"class":59},"    for",[53,201,202],{"class":121}," (",[53,204,205],{"class":59},"int",[53,207,208],{"class":121}," value ",[53,210,163],{"class":59},[53,212,213],{"class":166}," 1",[53,215,216],{"class":121},"; value ",[53,218,219],{"class":59},"\u003C=",[53,221,222],{"class":166}," 3",[53,224,225],{"class":121},"; ",[53,227,228],{"class":59},"++",[53,230,231],{"class":121},"value)\n",[53,233,235],{"class":55,"line":234},17,[53,236,237],{"class":121},"    {\n",[53,239,241],{"class":55,"line":240},18,[53,242,243],{"class":121},"        {\n",[53,245,247,250,253,256,258,261,264,267],{"class":55,"line":246},19,[53,248,249],{"class":117},"            std",[53,251,252],{"class":121},"::lock_guard",[53,254,255],{"class":59},"\u003C",[53,257,118],{"class":117},[53,259,260],{"class":121},"::mutex",[53,262,263],{"class":59},">",[53,265,266],{"class":117}," lock",[53,268,269],{"class":121},"(queue_mutex);\n",[53,271,273,276,279],{"class":55,"line":272},20,[53,274,275],{"class":121},"            data_queue.",[53,277,278],{"class":117},"push",[53,280,281],{"class":121},"(value);\n",[53,283,285,287,290,293,296,299,301,303,306,309,312],{"class":55,"line":284},21,[53,286,249],{"class":117},[53,288,289],{"class":121},"::cout ",[53,291,292],{"class":59},"\u003C\u003C",[53,294,295],{"class":63}," \"produced \"",[53,297,298],{"class":59}," \u003C\u003C",[53,300,208],{"class":121},[53,302,292],{"class":59},[53,304,305],{"class":63}," \"",[53,307,308],{"class":166},"\\n",[53,310,311],{"class":63},"\"",[53,313,170],{"class":121},[53,315,317],{"class":55,"line":316},22,[53,318,319],{"class":121},"        }\n",[53,321,323],{"class":55,"line":322},23,[53,324,111],{"emptyLinePlaceholder":110},[53,326,328,331,334],{"class":55,"line":327},24,[53,329,330],{"class":121},"        queue_cv.",[53,332,333],{"class":117},"notify_one",[53,335,336],{"class":121},"();\n",[53,338,340,343,346,349,351,354,357,359,361,364,366,369,371,374],{"class":55,"line":339},25,[53,341,342],{"class":117},"        std",[53,344,345],{"class":121},"::",[53,347,348],{"class":117},"this_thread",[53,350,345],{"class":121},[53,352,353],{"class":117},"sleep_for",[53,355,356],{"class":121},"(",[53,358,118],{"class":117},[53,360,345],{"class":121},[53,362,363],{"class":117},"chrono",[53,365,345],{"class":121},[53,367,368],{"class":117},"milliseconds",[53,370,356],{"class":121},[53,372,373],{"class":166},"50",[53,375,376],{"class":121},"));\n",[53,378,380],{"class":55,"line":379},26,[53,381,382],{"class":121},"    }\n",[53,384,386],{"class":55,"line":385},27,[53,387,111],{"emptyLinePlaceholder":110},[53,389,391],{"class":55,"line":390},28,[53,392,237],{"class":121},[53,394,396,398,400,402,404,406,408,410],{"class":55,"line":395},29,[53,397,342],{"class":117},[53,399,252],{"class":121},[53,401,255],{"class":59},[53,403,118],{"class":117},[53,405,260],{"class":121},[53,407,263],{"class":59},[53,409,266],{"class":117},[53,411,269],{"class":121},[53,413,415,418,420,423],{"class":55,"line":414},30,[53,416,417],{"class":121},"        finished ",[53,419,163],{"class":59},[53,421,422],{"class":166}," true",[53,424,170],{"class":121},[53,426,428],{"class":55,"line":427},31,[53,429,382],{"class":121},[53,431,433,436,438],{"class":55,"line":432},32,[53,434,435],{"class":121},"    queue_cv.",[53,437,333],{"class":117},[53,439,336],{"class":121},[53,441,443],{"class":55,"line":442},33,[53,444,445],{"class":121},"}\n",[53,447,449],{"class":55,"line":448},34,[53,450,111],{"emptyLinePlaceholder":110},[53,452,454,456,459],{"class":55,"line":453},35,[53,455,181],{"class":59},[53,457,458],{"class":117}," consumer",[53,460,187],{"class":121},[53,462,464],{"class":55,"line":463},36,[53,465,193],{"class":121},[53,467,469,472,474,477],{"class":55,"line":468},37,[53,470,471],{"class":59},"    while",[53,473,202],{"class":121},[53,475,476],{"class":166},"true",[53,478,479],{"class":121},")\n",[53,481,483],{"class":55,"line":482},38,[53,484,237],{"class":121},[53,486,488,490,493,495,497,499,501,503],{"class":55,"line":487},39,[53,489,342],{"class":117},[53,491,492],{"class":121},"::unique_lock",[53,494,255],{"class":59},[53,496,118],{"class":117},[53,498,260],{"class":121},[53,500,263],{"class":59},[53,502,266],{"class":117},[53,504,269],{"class":121},[53,506,508,510,513],{"class":55,"line":507},40,[53,509,330],{"class":121},[53,511,512],{"class":117},"wait",[53,514,515],{"class":121},"(lock, [] {\n",[53,517,519,522,525,528,531,534,537],{"class":55,"line":518},41,[53,520,521],{"class":59},"            return",[53,523,524],{"class":59}," !",[53,526,527],{"class":121},"data_queue.",[53,529,530],{"class":117},"empty",[53,532,533],{"class":121},"() ",[53,535,536],{"class":59},"||",[53,538,539],{"class":121}," finished;\n",[53,541,543],{"class":55,"line":542},42,[53,544,545],{"class":121},"        });\n",[53,547,549],{"class":55,"line":548},43,[53,550,111],{"emptyLinePlaceholder":110},[53,552,554,557,559,562,564,566],{"class":55,"line":553},44,[53,555,556],{"class":59},"        while",[53,558,202],{"class":121},[53,560,561],{"class":59},"!",[53,563,527],{"class":121},[53,565,530],{"class":117},[53,567,568],{"class":121},"())\n",[53,570,572],{"class":55,"line":571},45,[53,573,243],{"class":121},[53,575,577,580,582,584,587,590],{"class":55,"line":576},46,[53,578,579],{"class":59},"            int",[53,581,208],{"class":121},[53,583,163],{"class":59},[53,585,586],{"class":121}," data_queue.",[53,588,589],{"class":117},"front",[53,591,336],{"class":121},[53,593,595,597,600],{"class":55,"line":594},47,[53,596,275],{"class":121},[53,598,599],{"class":117},"pop",[53,601,336],{"class":121},[53,603,605],{"class":55,"line":604},48,[53,606,111],{"emptyLinePlaceholder":110},[53,608,610,613,616],{"class":55,"line":609},49,[53,611,612],{"class":121},"            lock.",[53,614,615],{"class":117},"unlock",[53,617,336],{"class":121},[53,619,621,623,625,627,630,632,634,636,638,640,642],{"class":55,"line":620},50,[53,622,249],{"class":117},[53,624,289],{"class":121},[53,626,292],{"class":59},[53,628,629],{"class":63}," \"consumed \"",[53,631,298],{"class":59},[53,633,208],{"class":121},[53,635,292],{"class":59},[53,637,305],{"class":63},[53,639,308],{"class":166},[53,641,311],{"class":63},[53,643,170],{"class":121},[53,645,647,649,652],{"class":55,"line":646},51,[53,648,612],{"class":121},[53,650,651],{"class":117},"lock",[53,653,336],{"class":121},[53,655,657],{"class":55,"line":656},52,[53,658,319],{"class":121},[53,660,662],{"class":55,"line":661},53,[53,663,111],{"emptyLinePlaceholder":110},[53,665,667,670],{"class":55,"line":666},54,[53,668,669],{"class":59},"        if",[53,671,672],{"class":121}," (finished)\n",[53,674,676],{"class":55,"line":675},55,[53,677,243],{"class":121},[53,679,681,684],{"class":55,"line":680},56,[53,682,683],{"class":59},"            break",[53,685,170],{"class":121},[53,687,689],{"class":55,"line":688},57,[53,690,319],{"class":121},[53,692,694],{"class":55,"line":693},58,[53,695,382],{"class":121},[53,697,699],{"class":55,"line":698},59,[53,700,445],{"class":121},[53,702,704],{"class":55,"line":703},60,[53,705,111],{"emptyLinePlaceholder":110},[53,707,709,711,714],{"class":55,"line":708},61,[53,710,205],{"class":59},[53,712,713],{"class":117}," main",[53,715,187],{"class":121},[53,717,719],{"class":55,"line":718},62,[53,720,193],{"class":121},[53,722,724],{"class":55,"line":723},63,[53,725,726],{"class":134},"    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[53,728,730],{"class":55,"line":729},64,[53,731,732],{"class":134},"    // 创建子线程，让这部分代码和 main 线程并发运行。\n",[53,734,736,739,742,744],{"class":55,"line":735},65,[53,737,738],{"class":117},"    std",[53,740,741],{"class":121},"::thread ",[53,743,14],{"class":117},[53,745,746],{"class":121},"(producer);\n",[53,748,750,752,754,757],{"class":55,"line":749},66,[53,751,738],{"class":117},[53,753,741],{"class":121},[53,755,756],{"class":117},"c",[53,758,759],{"class":121},"(consumer);\n",[53,761,763],{"class":55,"line":762},67,[53,764,111],{"emptyLinePlaceholder":110},[53,766,768],{"class":55,"line":767},68,[53,769,770],{"class":134},"    // join 会等待子线程结束，避免 main 提前退出。\n",[53,772,774,777,780],{"class":55,"line":773},69,[53,775,776],{"class":121},"    p.",[53,778,779],{"class":117},"join",[53,781,336],{"class":121},[53,783,785,788,790],{"class":55,"line":784},70,[53,786,787],{"class":121},"    c.",[53,789,779],{"class":117},[53,791,336],{"class":121},[53,793,795],{"class":55,"line":794},71,[53,796,111],{"emptyLinePlaceholder":110},[53,798,800,802,804,806,809,811,813],{"class":55,"line":799},72,[53,801,738],{"class":117},[53,803,289],{"class":121},[53,805,292],{"class":59},[53,807,808],{"class":63}," \"all done",[53,810,308],{"class":166},[53,812,311],{"class":63},[53,814,170],{"class":121},[53,816,818],{"class":55,"line":817},73,[53,819,111],{"emptyLinePlaceholder":110},[53,821,823,826,829],{"class":55,"line":822},74,[53,824,825],{"class":59},"    return",[53,827,828],{"class":166}," 0",[53,830,170],{"class":121},[53,832,834],{"class":55,"line":833},75,[53,835,445],{"class":121},[14,837,838,842],{},[839,840,841],"strong",{},"一种可能的运行结果","：",[44,844,849],{"className":845,"code":847,"language":848,"meta":49},[846],"language-text","produced 1\nconsumed 1\nproduced 2\nconsumed 2\nproduced 3\nconsumed 3\nall done\n","text",[17,850,847],{"__ignoreMap":49},[14,852,853,856],{},[17,854,855],{},"queue_cv.wait(lock, 条件)"," 很重要。线程被唤醒后会重新检查条件，避免虚假唤醒导致逻辑错误。",[39,858,860],{"id":859},"示例-2等待一次通知","示例 2：等待一次通知",[14,862,863,864,866,867,869],{},"如果只是一个线程等待另一个线程准备好数据，也可以用条件变量。这个例子比生产者消费者更短，适合先理解 ",[17,865,512],{}," 和 ",[17,868,333],{}," 的配合。",[44,871,873],{"className":46,"code":872,"language":48,"meta":49,"style":49},"#include \u003Ccondition_variable>\n#include \u003Ciostream>\n#include \u003Cmutex>\n#include \u003Cstring>\n#include \u003Cthread>\n\n// 加锁用来保护共享数据，避免多个线程同时修改造成数据竞争。\nstd::mutex data_mutex;\nstd::condition_variable data_cv;\nstd::string message;\nbool ready = false;\n\nvoid prepare()\n{\n    {\n        std::lock_guard\u003Cstd::mutex> lock(data_mutex);\n        message = \"hello from worker\";\n        ready = true;\n    }\n\n    data_cv.notify_one();\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    // 创建子线程，让这部分代码和 main 线程并发运行。\n    std::thread worker(prepare);\n\n    std::unique_lock\u003Cstd::mutex> lock(data_mutex);\n    data_cv.wait(lock, [] {\n        return ready;\n    });\n\n    std::cout \u003C\u003C message \u003C\u003C \"\\n\";\n\n    lock.unlock();\n    // join 会等待子线程结束，避免 main 提前退出。\n    worker.join();\n\n    return 0;\n}\n",[17,874,875,881,887,893,900,906,910,914,921,928,935,948,952,961,965,969,988,1000,1011,1015,1019,1028,1032,1036,1044,1048,1052,1056,1068,1072,1090,1098,1106,1111,1115,1136,1140,1149,1153,1162,1166,1174],{"__ignoreMap":49},[53,876,877,879],{"class":55,"line":56},[53,878,60],{"class":59},[53,880,72],{"class":63},[53,882,883,885],{"class":55,"line":67},[53,884,60],{"class":59},[53,886,80],{"class":63},[53,888,889,891],{"class":55,"line":75},[53,890,60],{"class":59},[53,892,88],{"class":63},[53,894,895,897],{"class":55,"line":83},[53,896,60],{"class":59},[53,898,899],{"class":63}," \u003Cstring>\n",[53,901,902,904],{"class":55,"line":91},[53,903,60],{"class":59},[53,905,104],{"class":63},[53,907,908],{"class":55,"line":99},[53,909,111],{"emptyLinePlaceholder":110},[53,911,912],{"class":55,"line":107},[53,913,135],{"class":134},[53,915,916,918],{"class":55,"line":114},[53,917,118],{"class":117},[53,919,920],{"class":121},"::mutex data_mutex;\n",[53,922,923,925],{"class":55,"line":131},[53,924,118],{"class":117},[53,926,927],{"class":121},"::condition_variable data_cv;\n",[53,929,930,932],{"class":55,"line":138},[53,931,118],{"class":117},[53,933,934],{"class":121},"::string message;\n",[53,936,937,939,942,944,946],{"class":55,"line":146},[53,938,157],{"class":59},[53,940,941],{"class":121}," ready ",[53,943,163],{"class":59},[53,945,167],{"class":166},[53,947,170],{"class":121},[53,949,950],{"class":55,"line":154},[53,951,111],{"emptyLinePlaceholder":110},[53,953,954,956,959],{"class":55,"line":173},[53,955,181],{"class":59},[53,957,958],{"class":117}," prepare",[53,960,187],{"class":121},[53,962,963],{"class":55,"line":178},[53,964,193],{"class":121},[53,966,967],{"class":55,"line":190},[53,968,237],{"class":121},[53,970,971,973,975,977,979,981,983,985],{"class":55,"line":196},[53,972,342],{"class":117},[53,974,252],{"class":121},[53,976,255],{"class":59},[53,978,118],{"class":117},[53,980,260],{"class":121},[53,982,263],{"class":59},[53,984,266],{"class":117},[53,986,987],{"class":121},"(data_mutex);\n",[53,989,990,993,995,998],{"class":55,"line":234},[53,991,992],{"class":121},"        message ",[53,994,163],{"class":59},[53,996,997],{"class":63}," \"hello from worker\"",[53,999,170],{"class":121},[53,1001,1002,1005,1007,1009],{"class":55,"line":240},[53,1003,1004],{"class":121},"        ready ",[53,1006,163],{"class":59},[53,1008,422],{"class":166},[53,1010,170],{"class":121},[53,1012,1013],{"class":55,"line":246},[53,1014,382],{"class":121},[53,1016,1017],{"class":55,"line":272},[53,1018,111],{"emptyLinePlaceholder":110},[53,1020,1021,1024,1026],{"class":55,"line":284},[53,1022,1023],{"class":121},"    data_cv.",[53,1025,333],{"class":117},[53,1027,336],{"class":121},[53,1029,1030],{"class":55,"line":316},[53,1031,445],{"class":121},[53,1033,1034],{"class":55,"line":322},[53,1035,111],{"emptyLinePlaceholder":110},[53,1037,1038,1040,1042],{"class":55,"line":327},[53,1039,205],{"class":59},[53,1041,713],{"class":117},[53,1043,187],{"class":121},[53,1045,1046],{"class":55,"line":339},[53,1047,193],{"class":121},[53,1049,1050],{"class":55,"line":379},[53,1051,726],{"class":134},[53,1053,1054],{"class":55,"line":385},[53,1055,732],{"class":134},[53,1057,1058,1060,1062,1065],{"class":55,"line":390},[53,1059,738],{"class":117},[53,1061,741],{"class":121},[53,1063,1064],{"class":117},"worker",[53,1066,1067],{"class":121},"(prepare);\n",[53,1069,1070],{"class":55,"line":395},[53,1071,111],{"emptyLinePlaceholder":110},[53,1073,1074,1076,1078,1080,1082,1084,1086,1088],{"class":55,"line":414},[53,1075,738],{"class":117},[53,1077,492],{"class":121},[53,1079,255],{"class":59},[53,1081,118],{"class":117},[53,1083,260],{"class":121},[53,1085,263],{"class":59},[53,1087,266],{"class":117},[53,1089,987],{"class":121},[53,1091,1092,1094,1096],{"class":55,"line":427},[53,1093,1023],{"class":121},[53,1095,512],{"class":117},[53,1097,515],{"class":121},[53,1099,1100,1103],{"class":55,"line":432},[53,1101,1102],{"class":59},"        return",[53,1104,1105],{"class":121}," ready;\n",[53,1107,1108],{"class":55,"line":442},[53,1109,1110],{"class":121},"    });\n",[53,1112,1113],{"class":55,"line":448},[53,1114,111],{"emptyLinePlaceholder":110},[53,1116,1117,1119,1121,1123,1126,1128,1130,1132,1134],{"class":55,"line":453},[53,1118,738],{"class":117},[53,1120,289],{"class":121},[53,1122,292],{"class":59},[53,1124,1125],{"class":121}," message ",[53,1127,292],{"class":59},[53,1129,305],{"class":63},[53,1131,308],{"class":166},[53,1133,311],{"class":63},[53,1135,170],{"class":121},[53,1137,1138],{"class":55,"line":463},[53,1139,111],{"emptyLinePlaceholder":110},[53,1141,1142,1145,1147],{"class":55,"line":468},[53,1143,1144],{"class":121},"    lock.",[53,1146,615],{"class":117},[53,1148,336],{"class":121},[53,1150,1151],{"class":55,"line":482},[53,1152,770],{"class":134},[53,1154,1155,1158,1160],{"class":55,"line":487},[53,1156,1157],{"class":121},"    worker.",[53,1159,779],{"class":117},[53,1161,336],{"class":121},[53,1163,1164],{"class":55,"line":507},[53,1165,111],{"emptyLinePlaceholder":110},[53,1167,1168,1170,1172],{"class":55,"line":518},[53,1169,825],{"class":59},[53,1171,828],{"class":166},[53,1173,170],{"class":121},[53,1175,1176],{"class":55,"line":542},[53,1177,445],{"class":121},[14,1179,1180,842],{},[839,1181,1182],{},"运行结果",[44,1184,1187],{"className":1185,"code":1186,"language":848,"meta":49},[846],"hello from worker\n",[17,1188,1186],{"__ignoreMap":49},[10,1190,1191],{"id":1191},"常见错误",[1193,1194,1195,1201,1212,1215],"ol",{},[1196,1197,1198,1200],"li",{},[17,1199,33],{}," 不写条件谓词，只靠一次唤醒，容易被虚假唤醒影响。",[1196,1202,1203,1204,1207,1208,1211],{},"修改共享条件后忘记 ",[17,1205,1206],{},"notify_one()"," 或 ",[17,1209,1210],{},"notify_all()","。",[1196,1213,1214],{},"持锁期间做耗时处理，导致其他线程不能及时推进。",[1196,1216,1217],{},"没有把条件变量、互斥锁、共享条件放在同一套逻辑里维护。",[10,1219,1220],{"id":1220},"小结",[1222,1223,1224,1229,1237,1243,1250],"ul",{},[1196,1225,1226,1228],{},[17,1227,5],{}," 用于线程间等待和通知。",[1196,1230,1231,1233,1234,1211],{},[17,1232,33],{}," 通常要配合 ",[17,1235,1236],{},"unique_lock",[1196,1238,1239,1240,1211],{},"推荐写 ",[17,1241,1242],{},"cv.wait(lock, [] { return 条件; });",[1196,1244,1245,1246,1207,1248,1211],{},"修改条件后调用 ",[17,1247,1206],{},[17,1249,1210],{},[1196,1251,1252],{},"条件变量适合生产者消费者、任务队列、等待初始化完成等场景。",[1254,1255,1256],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":49,"searchDepth":67,"depth":67,"links":1258},[1259,1260,1264,1265],{"id":12,"depth":67,"text":12},{"id":37,"depth":67,"text":37,"children":1261},[1262,1263],{"id":41,"depth":75,"text":42},{"id":859,"depth":75,"text":860},{"id":1191,"depth":67,"text":1191},{"id":1220,"depth":67,"text":1220},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","18.19.4",18190400,"2023-10-05","wiki/2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","zh-CN","zh-cn",{},{"title":5,"description":49},"7XdG1lH_qJ0H8JOJLHEy8MrYt9y8bHBIQgBicn38nQ8",[1285,1291,1297,1303,1309,1315,1321,1327,1333,1339,1345,1351,1357,1363,1369,1375,1381,1387,1393,1399,1405,1411,1417,1423,1429,1435,1441,1447,1453,1459,1465,1471,1477,1483,1489,1495,1501,1502,1508,1514,1520,1526,1532,1538,1544,1550,1556,1562,1568,1574,1580,1586,1592,1598,1604,1610,1616,1622,1628,1634,1640,1646,1652,1658,1664,1670,1676,1682,1688,1694],{"path":1286,"stem":1287,"title":1288,"date":1269,"chapter":1289,"chapterSort":1290,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch1-c-ji-chu-chu-shi","wiki/2023-10-05-Cplusplus教学/ch1-C++基础初识","C++基础初识","1",1000000,{"path":1292,"stem":1293,"title":1294,"date":1269,"chapter":1295,"chapterSort":1296,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch10-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch10-内存分区与生命周期","内存分区与生命周期","10",10000000,{"path":1298,"stem":1299,"title":1300,"date":1269,"chapter":1301,"chapterSort":1302,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":1304,"stem":1305,"title":1306,"date":1269,"chapter":1307,"chapterSort":1308,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch12-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch12-函数提高与命名空间","函数提高与命名空间","12",12000000,{"path":1310,"stem":1311,"title":1312,"date":1269,"chapter":1313,"chapterSort":1314,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":1316,"stem":1317,"title":1318,"date":1269,"chapter":1319,"chapterSort":1320,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-2-dui-xiang-chu-shi-hua-he-qing-li","wiki/2023-10-05-Cplusplus教学/ch13-2-对象初始化和清理","对象初始化和清理","13.2",13020000,{"path":1322,"stem":1323,"title":1324,"date":1269,"chapter":1325,"chapterSort":1326,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-3-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch13-3-对象模型与this指针","对象模型与this指针","13.3",13030000,{"path":1328,"stem":1329,"title":1330,"date":1269,"chapter":1331,"chapterSort":1332,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-4-you-yuan-yu-yun-suan-fu-zhong-zai","wiki/2023-10-05-Cplusplus教学/ch13-4-友元与运算符重载","友元与运算符重载","13.4",13040000,{"path":1334,"stem":1335,"title":1336,"date":1269,"chapter":1337,"chapterSort":1338,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":1340,"stem":1341,"title":1342,"date":1269,"chapter":1343,"chapterSort":1344,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":1346,"stem":1347,"title":1348,"date":1269,"chapter":1349,"chapterSort":1350,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":1352,"stem":1353,"title":1354,"date":1269,"chapter":1355,"chapterSort":1356,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":1358,"stem":1359,"title":1360,"date":1269,"chapter":1361,"chapterSort":1362,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":1364,"stem":1365,"title":1366,"date":1269,"chapter":1367,"chapterSort":1368,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-1-stl-chu-shi","wiki/2023-10-05-Cplusplus教学/ch16-1-STL初识","STL初识","16.1",16010000,{"path":1370,"stem":1371,"title":1372,"date":1269,"chapter":1373,"chapterSort":1374,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-2-std-array","wiki/2023-10-05-Cplusplus教学/ch16-2-std-array","std::array","16.2",16020000,{"path":1376,"stem":1377,"title":1378,"date":1269,"chapter":1379,"chapterSort":1380,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-3-string-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-3-string容器","string容器","16.3",16030000,{"path":1382,"stem":1383,"title":1384,"date":1269,"chapter":1385,"chapterSort":1386,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-4-vector-yu-deque-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-4-vector与deque容器","vector与deque容器","16.4",16040000,{"path":1388,"stem":1389,"title":1390,"date":1269,"chapter":1391,"chapterSort":1392,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-5-stack-queue-list-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-5-stack-queue-list容器","stack / queue / list 容器","16.5",16050000,{"path":1394,"stem":1395,"title":1396,"date":1269,"chapter":1397,"chapterSort":1398,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-6-set-map-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-6-set-map容器","set / map 容器","16.6",16060000,{"path":1400,"stem":1401,"title":1402,"date":1269,"chapter":1403,"chapterSort":1404,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-7-han-shu-dui-xiang-yu-wei-ci","wiki/2023-10-05-Cplusplus教学/ch16-7-函数对象与谓词","函数对象与谓词","16.7",16070000,{"path":1406,"stem":1407,"title":1408,"date":1269,"chapter":1409,"chapterSort":1410,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-8-chang-yong-suan-fa","wiki/2023-10-05-Cplusplus教学/ch16-8-常用算法","常用算法","16.8",16080000,{"path":1412,"stem":1413,"title":1414,"date":1269,"chapter":1415,"chapterSort":1416,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-stl-ti-gao-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch16-STL提高编程","STL提高编程","16",16000000,{"path":1418,"stem":1419,"title":1420,"date":1269,"chapter":1421,"chapterSort":1422,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch17-c-lei-xing-zhuan-huan","wiki/2023-10-05-Cplusplus教学/ch17-C++类型转换","C++类型转换","17",17000000,{"path":1424,"stem":1425,"title":1426,"date":1269,"chapter":1427,"chapterSort":1428,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-1-auto","wiki/2023-10-05-Cplusplus教学/ch18-1-auto","auto","18.1",18010000,{"path":1430,"stem":1431,"title":1432,"date":1269,"chapter":1433,"chapterSort":1434,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义","右值引用和移动语义","18.10",18100000,{"path":1436,"stem":1437,"title":1438,"date":1269,"chapter":1439,"chapterSort":1440,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-11-lambda-biao-da-shi","wiki/2023-10-05-Cplusplus教学/ch18-11-Lambda表达式","Lambda 表达式","18.11",18110000,{"path":1442,"stem":1443,"title":1444,"date":1269,"chapter":1445,"chapterSort":1446,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","wiki/2023-10-05-Cplusplus教学/ch18-12-std-function","std::function","18.12",18120000,{"path":1448,"stem":1449,"title":1450,"date":1269,"chapter":1451,"chapterSort":1452,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","std::bind","18.13",18130000,{"path":1454,"stem":1455,"title":1456,"date":1269,"chapter":1457,"chapterSort":1458,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-14-std-optional","wiki/2023-10-05-Cplusplus教学/ch18-14-std-optional","std::optional","18.14",18140000,{"path":1460,"stem":1461,"title":1462,"date":1269,"chapter":1463,"chapterSort":1464,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":1466,"stem":1467,"title":1468,"date":1269,"chapter":1469,"chapterSort":1470,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-16-std-span","wiki/2023-10-05-Cplusplus教学/ch18-16-std-span","std::span","18.16",18160000,{"path":1472,"stem":1473,"title":1474,"date":1269,"chapter":1475,"chapterSort":1476,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-17-std-format-print","wiki/2023-10-05-Cplusplus教学/ch18-17-std-format-print","std::format / std::print","18.17",18170000,{"path":1478,"stem":1479,"title":1480,"date":1269,"chapter":1481,"chapterSort":1482,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-18-std-chrono","wiki/2023-10-05-Cplusplus教学/ch18-18-std-chrono","std::chrono","18.18",18180000,{"path":1484,"stem":1485,"title":1486,"date":1269,"chapter":1487,"chapterSort":1488,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","wiki/2023-10-05-Cplusplus教学/ch18-19-1-std-thread","std::thread 与 join","18.19.1",18190100,{"path":1490,"stem":1491,"title":1492,"date":1269,"chapter":1493,"chapterSort":1494,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-2-mutex-lock-guard","wiki/2023-10-05-Cplusplus教学/ch18-19-2-mutex-lock-guard","mutex 与 lock_guard","18.19.2",18190200,{"path":1496,"stem":1497,"title":1498,"date":1269,"chapter":1499,"chapterSort":1500,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-3-std-atomic","wiki/2023-10-05-Cplusplus教学/ch18-19-3-std-atomic","std::atomic","18.19.3",18190300,{"path":1266,"stem":1275,"title":5,"date":1269,"chapter":1267,"chapterSort":1268,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},{"path":1503,"stem":1504,"title":1505,"date":1269,"chapter":1506,"chapterSort":1507,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-bing-fa-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch18-19-并发编程","并发编程","18.19",18190000,{"path":1509,"stem":1510,"title":1511,"date":1269,"chapter":1512,"chapterSort":1513,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-2-nullptr","wiki/2023-10-05-Cplusplus教学/ch18-2-nullptr","nullptr","18.2",18020000,{"path":1515,"stem":1516,"title":1517,"date":1269,"chapter":1518,"chapterSort":1519,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-20-std-filesystem","wiki/2023-10-05-Cplusplus教学/ch18-20-std-filesystem","std::filesystem","18.20",18200000,{"path":1521,"stem":1522,"title":1523,"date":1269,"chapter":1524,"chapterSort":1525,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-21-modules-jian-jie","wiki/2023-10-05-Cplusplus教学/ch18-21-modules简介","modules 简介","18.21",18210000,{"path":1527,"stem":1528,"title":1529,"date":1269,"chapter":1530,"chapterSort":1531,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","using","18.3",18030000,{"path":1533,"stem":1534,"title":1535,"date":1269,"chapter":1536,"chapterSort":1537,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-4-enum-class","wiki/2023-10-05-Cplusplus教学/ch18-4-enum-class","enum class","18.4",18040000,{"path":1539,"stem":1540,"title":1541,"date":1269,"chapter":1542,"chapterSort":1543,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-5-fan-wei-for-xun-huan","wiki/2023-10-05-Cplusplus教学/ch18-5-范围for循环","范围 for 循环","18.5",18050000,{"path":1545,"stem":1546,"title":1547,"date":1269,"chapter":1548,"chapterSort":1549,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-6-jie-gou-hua-bang-ding","wiki/2023-10-05-Cplusplus教学/ch18-6-结构化绑定","结构化绑定","18.6",18060000,{"path":1551,"stem":1552,"title":1553,"date":1269,"chapter":1554,"chapterSort":1555,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-7-constexpr","wiki/2023-10-05-Cplusplus教学/ch18-7-constexpr","constexpr","18.7",18070000,{"path":1557,"stem":1558,"title":1559,"date":1269,"chapter":1560,"chapterSort":1561,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","wiki/2023-10-05-Cplusplus教学/ch18-8-RAII","RAII","18.8",18080000,{"path":1563,"stem":1564,"title":1565,"date":1269,"chapter":1566,"chapterSort":1567,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针","智能指针","18.9",18090000,{"path":1569,"stem":1570,"title":1571,"date":1269,"chapter":1572,"chapterSort":1573,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":1575,"stem":1576,"title":1577,"date":1269,"chapter":1578,"chapterSort":1579,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-1-ding-shi-qi-yu-yi-bu-io","wiki/2023-10-05-Cplusplus教学/ch19-1-1-定时器与异步IO","定时器与异步 IO","19.1.1",19010100,{"path":1581,"stem":1582,"title":1583,"date":1269,"chapter":1584,"chapterSort":1585,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-2-boost-asio-ji-chu","wiki/2023-10-05-Cplusplus教学/ch19-1-2-Boost.Asio基础","Boost.Asio 基础","19.1.2",19010200,{"path":1587,"stem":1588,"title":1589,"date":1269,"chapter":1590,"chapterSort":1591,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-3-chuan-kou-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-3-串口通信","串口通信","19.1.3",19010300,{"path":1593,"stem":1594,"title":1595,"date":1269,"chapter":1596,"chapterSort":1597,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-4-tcp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-4-TCP通信","TCP 通信","19.1.4",19010400,{"path":1599,"stem":1600,"title":1601,"date":1269,"chapter":1602,"chapterSort":1603,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-5-udp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-5-UDP通信","UDP 通信","19.1.5",19010500,{"path":1605,"stem":1606,"title":1607,"date":1269,"chapter":1608,"chapterSort":1609,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-6-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch19-1-6-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","19.1.6",19010600,{"path":1611,"stem":1612,"title":1613,"date":1269,"chapter":1614,"chapterSort":1615,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-boost-asio-yi-bu-io-ku","wiki/2023-10-05-Cplusplus教学/ch19-1-Boost.Asio异步IO库","Boost.Asio异步IO库","19.1",19010000,{"path":1617,"stem":1618,"title":1619,"date":1269,"chapter":1620,"chapterSort":1621,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-2-eigen-xian-xing-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-2-Eigen线性代数库","Eigen线性代数库","19.2",19020000,{"path":1623,"stem":1624,"title":1625,"date":1269,"chapter":1626,"chapterSort":1627,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-3-opencv-ji-suan-ji-shi-jue-ku","wiki/2023-10-05-Cplusplus教学/ch19-3-OpenCV计算机视觉库","OpenCV计算机视觉库","19.3",19030000,{"path":1629,"stem":1630,"title":1631,"date":1269,"chapter":1632,"chapterSort":1633,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-4-pcl-dian-yun-ku","wiki/2023-10-05-Cplusplus教学/ch19-4-PCL点云库","PCL点云库","19.4",19040000,{"path":1635,"stem":1636,"title":1637,"date":1269,"chapter":1638,"chapterSort":1639,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-5-sophus-li-qun-li-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-5-Sophus李群李代数库","Sophus 李群李代数库","19.5",19050000,{"path":1641,"stem":1642,"title":1643,"date":1269,"chapter":1644,"chapterSort":1645,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":1647,"stem":1648,"title":1649,"date":1269,"chapter":1650,"chapterSort":1651,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch2-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki/2023-10-05-Cplusplus教学/ch2-数据类型与数据存放","数据类型与数据存放","2",2000000,{"path":1653,"stem":1654,"title":1655,"date":1269,"chapter":1656,"chapterSort":1657,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出","3",3000000,{"path":1659,"stem":1660,"title":1661,"date":1269,"chapter":1662,"chapterSort":1663,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符","4",4000000,{"path":1665,"stem":1666,"title":1667,"date":1269,"chapter":1668,"chapterSort":1669,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构","5",5000000,{"path":1671,"stem":1672,"title":1673,"date":1269,"chapter":1674,"chapterSort":1675,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组","6",6000000,{"path":1677,"stem":1678,"title":1679,"date":1269,"chapter":1680,"chapterSort":1681,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件","7",7000000,{"path":1683,"stem":1684,"title":1685,"date":1269,"chapter":1686,"chapterSort":1687,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针","8",8000000,{"path":1689,"stem":1690,"title":1691,"date":1269,"chapter":1692,"chapterSort":1693,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":1276},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch9-jie-gou-ti-yu-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch9-结构体与共用体","结构体与共用体","9",9000000,{"path":1272,"stem":1695,"title":1696,"date":1269,"chapter":1277,"chapterSort":1697,"docKey":1271,"docRoot":1272,"docTitle":1273,"isWikiDoc":110,"isWikiIndex":110},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":1699},[1700,1703,1706,1709,1712],{"path":1701,"localeSlug":1702,"i18nKey":1275},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","en-us",{"path":1704,"localeSlug":1705,"i18nKey":1275},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","zh-hant",{"path":1707,"localeSlug":1708,"i18nKey":1275},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","zh-hk",{"path":1710,"localeSlug":1711,"i18nKey":1275},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","zh-tw",{"path":1266,"localeSlug":1280,"i18nKey":1275},[1701,1278,1704,1278,1707,1278,1710,1278,1266,1278],1780663038390]