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