[{"data":1,"prerenderedAt":6652},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io":6231,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io":6636,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io":6651},{"id":4,"title":5,"body":6,"canonicalPath":6213,"chapterDepth":75,"chapterOrder":6214,"date":6215,"description":57,"docI18nKey":6216,"docKey":6217,"docRoot":6218,"docTitle":6219,"extension":6220,"i18nKey":6221,"isBlogPost":6222,"isWikiDoc":94,"isWikiIndex":6222,"layout":6223,"legacyPath":6223,"locale":6224,"localeSlug":6225,"meta":6226,"navigation":94,"path":6213,"seo":6227,"sourcePath":6228,"sourceStem":6221,"stem":6229,"wikiDepth":64,"__hash__":6230},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO.md","Timers and Asynchronous I\u002FO",{"type":7,"value":8,"toc":6135},"minimark",[9,21,28,31,39,44,47,51,294,301,305,340,344,352,355,361,364,370,374,381,384,398,401,405,412,415,422,428,431,434,443,450,474,477,483,486,493,496,498,504,507,510,538,541,937,941,944,972,975,978,984,987,1001,1004,1010,1012,1018,1021,1028,1031,1043,1049,1055,1061,1064,1093,1096,1102,1108,1139,1142,1148,1151,1154,1158,1161,1166,1169,1175,1181,1183,1189,1192,1195,1220,1223,1733,1737,1740,1768,1771,1773,1779,1782,1788,1791,1797,1799,1805,1808,1811,1822,1825,1831,1837,1840,1877,1880,1886,1892,1897,1899,1905,1908,1911,1914,1920,1923,2455,2459,2462,2490,2493,2495,2501,2504,2510,2513,2519,2521,2527,2530,2540,2543,2549,2552,2556,2559,2578,2585,2588,2594,2597,2599,2603,2606,2609,2612,2618,2621,3068,3072,3075,3103,3106,3108,3114,3117,3123,3125,3131,3135,3138,3199,3202,3208,3218,3222,3224,3270,3273,3279,3286,3292,3298,3306,3310,3313,3337,3342,3348,3378,3385,3387,3391,3394,3397,3414,3417,4042,4046,4049,4077,4080,4082,4088,4090,4096,4099,4105,4107,4113,4116,4123,4126,4138,4141,4143,4150,4153,4159,4162,4168,4171,4827,4831,4834,4862,4865,4868,4874,4877,4883,4886,4889,4892,4898,4907,4916,4918,4961,4964,4985,4988,4990,4998,5001,5011,5016,5022,5025,5902,5906,5909,5937,5940,5945,5951,5954,5960,5967,5970,5978,5981,5987,5990,5996,6001,6003,6023,6028,6031,6033,6037,6040,6079,6131],[10,11,12],"blockquote",{},[13,14,15,16,20],"p",{},"This section is the most important one in the entire Boost.Asio tutorial.\nSerial port, TCP, and UDP asynchronous models are similar to timers: you first register the asynchronous operation, and then ",[17,18,19],"code",{},"io_context.run()"," drives the callback execution.",[13,22,23,24,27],{},"All asynchronous callbacks in this section use ",[17,25,26],{},"std::bind",", and do not use lambdas for now.",[29,30],"hr",{},[32,33,35,36],"h2",{"id":34},"example-1-writing-a-synchronous-timer-in-an-ordinary-main","Example 1: Writing a synchronous timer in an ordinary ",[17,37,38],{},"main()",[40,41,43],"h3",{"id":42},"program-objective","program objective",[13,45,46],{},"First, write the simplest blocking timer: after the program starts, immediately print a sentence, then block for 2 seconds, and then print a final message.",[40,48,50],{"id":49},"full-code","Full code",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cchrono>\n#include \u003Ciostream>\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer(io, std::chrono::seconds(2));\n\n    std::cout \u003C\u003C \"程序开始：准备等待 2 秒\" \u003C\u003C std::endl;\n\n    \u002F\u002F 同步等待会阻塞当前线程，时间没到之前不会继续往下执行。\n    timer.wait();\n\n    std::cout \u003C\u003C \"2 秒到了：timer.wait() 返回\" \u003C\u003C std::endl;\n\n    return 0;\n}\n","cpp","",[17,59,60,73,81,89,96,110,116,123,129,144,149,155,196,201,225,230,236,248,253,271,276,288],{"__ignoreMap":57},[61,62,65,69],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"szBVR","#include",[61,70,72],{"class":71},"sZZnC"," \u003Cboost\u002Fasio.hpp>\n",[61,74,76,78],{"class":63,"line":75},2,[61,77,68],{"class":67},[61,79,80],{"class":71}," \u003Cchrono>\n",[61,82,84,86],{"class":63,"line":83},3,[61,85,68],{"class":67},[61,87,88],{"class":71}," \u003Ciostream>\n",[61,90,92],{"class":63,"line":91},4,[61,93,95],{"emptyLinePlaceholder":94},true,"\n",[61,97,99,102,106],{"class":63,"line":98},5,[61,100,101],{"class":67},"int",[61,103,105],{"class":104},"sScJk"," main",[61,107,109],{"class":108},"sVt8B","()\n",[61,111,113],{"class":63,"line":112},6,[61,114,115],{"class":108},"{\n",[61,117,119],{"class":63,"line":118},7,[61,120,122],{"class":121},"sJ8bj","    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[61,124,126],{"class":63,"line":125},8,[61,127,128],{"class":121},"    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n",[61,130,132,135,138,141],{"class":63,"line":131},9,[61,133,134],{"class":104},"    boost",[61,136,137],{"class":108},"::",[61,139,140],{"class":104},"asio",[61,142,143],{"class":108},"::io_context io;\n",[61,145,147],{"class":63,"line":146},10,[61,148,95],{"emptyLinePlaceholder":94},[61,150,152],{"class":63,"line":151},11,[61,153,154],{"class":121},"    \u002F\u002F 创建定时器，并设置到期时间。\n",[61,156,158,160,162,164,167,170,173,176,178,181,183,186,189,193],{"class":63,"line":157},12,[61,159,134],{"class":104},[61,161,137],{"class":108},[61,163,140],{"class":104},[61,165,166],{"class":108},"::steady_timer ",[61,168,169],{"class":104},"timer",[61,171,172],{"class":108},"(io, ",[61,174,175],{"class":104},"std",[61,177,137],{"class":108},[61,179,180],{"class":104},"chrono",[61,182,137],{"class":108},[61,184,185],{"class":104},"seconds",[61,187,188],{"class":108},"(",[61,190,192],{"class":191},"sj4cs","2",[61,194,195],{"class":108},"));\n",[61,197,199],{"class":63,"line":198},13,[61,200,95],{"emptyLinePlaceholder":94},[61,202,204,207,210,213,216,219,222],{"class":63,"line":203},14,[61,205,206],{"class":104},"    std",[61,208,209],{"class":108},"::cout ",[61,211,212],{"class":67},"\u003C\u003C",[61,214,215],{"class":71}," \"程序开始：准备等待 2 秒\"",[61,217,218],{"class":67}," \u003C\u003C",[61,220,221],{"class":104}," std",[61,223,224],{"class":108},"::endl;\n",[61,226,228],{"class":63,"line":227},15,[61,229,95],{"emptyLinePlaceholder":94},[61,231,233],{"class":63,"line":232},16,[61,234,235],{"class":121},"    \u002F\u002F 同步等待会阻塞当前线程，时间没到之前不会继续往下执行。\n",[61,237,239,242,245],{"class":63,"line":238},17,[61,240,241],{"class":108},"    timer.",[61,243,244],{"class":104},"wait",[61,246,247],{"class":108},"();\n",[61,249,251],{"class":63,"line":250},18,[61,252,95],{"emptyLinePlaceholder":94},[61,254,256,258,260,262,265,267,269],{"class":63,"line":255},19,[61,257,206],{"class":104},[61,259,209],{"class":108},[61,261,212],{"class":67},[61,263,264],{"class":71}," \"2 秒到了：timer.wait() 返回\"",[61,266,218],{"class":67},[61,268,221],{"class":104},[61,270,224],{"class":108},[61,272,274],{"class":63,"line":273},20,[61,275,95],{"emptyLinePlaceholder":94},[61,277,279,282,285],{"class":63,"line":278},21,[61,280,281],{"class":67},"    return",[61,283,284],{"class":191}," 0",[61,286,287],{"class":108},";\n",[61,289,291],{"class":63,"line":290},22,[61,292,293],{"class":108},"}\n",[13,295,296,300],{},[297,298,299],"strong",{},"Running Results",": See below for “Execution Output and Timeline”; specific times and sequences may vary slightly with the environment if the example involves timers, threads, networks, or external devices.",[40,302,304],{"id":303},"compile-and-run","Compile and run",[52,306,310],{"className":307,"code":308,"language":309,"meta":57,"style":57},"language-bash shiki shiki-themes github-light github-dark","g++ demo1_sync_timer.cpp -o demo1_sync_timer -std=c++17 -lboost_system -pthread\n.\u002Fdemo1_sync_timer\n","bash",[17,311,312,335],{"__ignoreMap":57},[61,313,314,317,320,323,326,329,332],{"class":63,"line":64},[61,315,316],{"class":104},"g++",[61,318,319],{"class":71}," demo1_sync_timer.cpp",[61,321,322],{"class":191}," -o",[61,324,325],{"class":71}," demo1_sync_timer",[61,327,328],{"class":191}," -std=c++17",[61,330,331],{"class":191}," -lboost_system",[61,333,334],{"class":191}," -pthread\n",[61,336,337],{"class":63,"line":75},[61,338,339],{"class":104},".\u002Fdemo1_sync_timer\n",[40,341,343],{"id":342},"execution-output-and-chronological-order","Execution output and chronological order",[52,345,350],{"className":346,"code":348,"language":349,"meta":57},[347],"language-text","程序开始：准备等待 2 秒\n","text",[17,351,348],{"__ignoreMap":57},[13,353,354],{},"After waiting about 2 seconds:",[52,356,359],{"className":357,"code":358,"language":349,"meta":57},[347],"2 秒到了：timer.wait() 返回\n",[17,360,358],{"__ignoreMap":57},[13,362,363],{},"请提供您要翻译的简体中文 Markdown 片段。",[52,365,368],{"className":366,"code":367,"language":349,"meta":57},[347],"程序开始：准备等待 2 秒\n2 秒到了：timer.wait() 返回\n",[17,369,367],{"__ignoreMap":57},[40,371,373],{"id":372},"points-to-note-for-this-example","Points to note for this example",[13,375,376,377,380],{},"This program does not demonstrate \"asynchronous\" behavior because ",[17,378,379],{},"timer.wait()"," directly blocks the current thread.",[13,382,383],{},"In other words, the program is stuck here:",[52,385,387],{"className":54,"code":386,"language":56,"meta":57,"style":57},"timer.wait();\n",[17,388,389],{"__ignoreMap":57},[61,390,391,394,396],{"class":63,"line":64},[61,392,393],{"class":108},"timer.",[61,395,244],{"class":104},[61,397,247],{"class":108},[13,399,400],{},"The next line will not execute until 2 seconds have passed.",[40,402,404],{"id":403},"key-function-explanation","Key Function Explanation",[406,407,409],"h4",{"id":408},"boostasioio_context-io",[17,410,411],{},"boost::asio::io_context io;",[13,413,414],{},"Purpose: Create an Asio event loop object.",[13,416,417,418,421],{},"In the synchronous ",[17,419,420],{},"wait()"," example, it doesn't seem very prominent; but in the asynchronous version, all asynchronous events rely on it to drive them.",[406,423,425],{"id":424},"boostasiosteady_timer-timerio-stdchronoseconds2",[17,426,427],{},"boost::asio::steady_timer timer(io, std::chrono::seconds(2));",[13,429,430],{},"Purpose: Create a timer based on a stable clock, set to expire after 2 seconds.",[13,432,433],{},"Parameter:",[52,435,437],{"className":54,"code":436,"language":56,"meta":57,"style":57},"io\n",[17,438,439],{"__ignoreMap":57},[61,440,441],{"class":63,"line":64},[61,442,436],{"class":108},[13,444,445,446,449],{},"Indicates which ",[17,447,448],{},"io_context"," manages this timer.",[52,451,453],{"className":54,"code":452,"language":56,"meta":57,"style":57},"std::chrono::seconds(2)\n",[17,454,455],{"__ignoreMap":57},[61,456,457,459,461,463,465,467,469,471],{"class":63,"line":64},[61,458,175],{"class":104},[61,460,137],{"class":108},[61,462,180],{"class":104},[61,464,137],{"class":108},[61,466,185],{"class":104},[61,468,188],{"class":108},[61,470,192],{"class":191},[61,472,473],{"class":108},")\n",[13,475,476],{},"Indicates expiration 2 seconds from the current time.",[406,478,480],{"id":479},"timerwait",[17,481,482],{},"timer.wait();",[13,484,485],{},"Purpose: blocks until the timer expires.",[13,487,488,489,492],{},"Return value: ",[17,490,491],{},"void",".",[13,494,495],{},"Features: Simple, but it will block the current thread. In a robot program, if written this way in the main control loop, it can easily hang the entire program.",[29,497],{},[32,499,501,502],{"id":500},"example-2-writing-an-asynchronous-timer-in-a-regular-main","Example 2: Writing an asynchronous timer in a regular ",[17,503,38],{},[40,505,43],{"id":506},"program-objective-1",[13,508,509],{},"Rewrite Example 1 using asynchronous syntax:",[511,512,513,517,523,529,532],"ol",{},[514,515,516],"li",{},"Register a 2-second timer;",[514,518,519,522],{},[17,520,521],{},"async_wait()"," non-blocking;",[514,524,525,528],{},[17,526,527],{},"io.run()"," starts blocking；",[514,530,531],{},"The callback function is executed after 2 seconds;",[514,533,534,535,537],{},"After no task, ",[17,536,527],{}," returns.",[40,539,50],{"id":540},"full-code-1",[52,542,544],{"className":54,"code":543,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n\nvoid on_timer(const boost::system::error_code& ec)\n{\n    if (ec)\n    {\n        std::cout \u003C\u003C \"定时器被取消，错误信息：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return;\n    }\n\n    std::cout \u003C\u003C \"回调函数 on_timer：2 秒到了\" \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer(io, std::chrono::seconds(2));\n\n    std::cout \u003C\u003C \"main：注册 async_wait\" \u003C\u003C std::endl;\n\n    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n    timer.async_wait(std::bind(on_timer, std::placeholders::_1));\n\n    std::cout \u003C\u003C \"main：async_wait 已经返回，但回调还没执行\" \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"main：准备调用 io.run()\" \u003C\u003C std::endl;\n\n    io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回，程序结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,545,546,552,559,565,572,578,582,616,620,628,633,662,669,674,678,695,699,703,711,715,719,723,733,738,743,774,779,797,802,808,838,843,861,879,884,895,900,918,923,932],{"__ignoreMap":57},[61,547,548,550],{"class":63,"line":64},[61,549,68],{"class":67},[61,551,72],{"class":71},[61,553,554,556],{"class":63,"line":75},[61,555,68],{"class":67},[61,557,558],{"class":71}," \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n",[61,560,561,563],{"class":63,"line":83},[61,562,68],{"class":67},[61,564,80],{"class":71},[61,566,567,569],{"class":63,"line":91},[61,568,68],{"class":67},[61,570,571],{"class":71}," \u003Cfunctional>\n",[61,573,574,576],{"class":63,"line":98},[61,575,68],{"class":67},[61,577,88],{"class":71},[61,579,580],{"class":63,"line":112},[61,581,95],{"emptyLinePlaceholder":94},[61,583,584,586,589,591,594,597,599,602,604,607,610,614],{"class":63,"line":118},[61,585,491],{"class":67},[61,587,588],{"class":104}," on_timer",[61,590,188],{"class":108},[61,592,593],{"class":67},"const",[61,595,596],{"class":104}," boost",[61,598,137],{"class":108},[61,600,601],{"class":104},"system",[61,603,137],{"class":108},[61,605,606],{"class":104},"error_code",[61,608,609],{"class":67},"&",[61,611,613],{"class":612},"s4XuR"," ec",[61,615,473],{"class":108},[61,617,618],{"class":63,"line":125},[61,619,115],{"class":108},[61,621,622,625],{"class":63,"line":131},[61,623,624],{"class":67},"    if",[61,626,627],{"class":108}," (ec)\n",[61,629,630],{"class":63,"line":146},[61,631,632],{"class":108},"    {\n",[61,634,635,638,640,642,645,647,650,653,656,658,660],{"class":63,"line":151},[61,636,637],{"class":104},"        std",[61,639,209],{"class":108},[61,641,212],{"class":67},[61,643,644],{"class":71}," \"定时器被取消，错误信息：\"",[61,646,218],{"class":67},[61,648,649],{"class":108}," ec.",[61,651,652],{"class":104},"message",[61,654,655],{"class":108},"() ",[61,657,212],{"class":67},[61,659,221],{"class":104},[61,661,224],{"class":108},[61,663,664,667],{"class":63,"line":157},[61,665,666],{"class":67},"        return",[61,668,287],{"class":108},[61,670,671],{"class":63,"line":198},[61,672,673],{"class":108},"    }\n",[61,675,676],{"class":63,"line":203},[61,677,95],{"emptyLinePlaceholder":94},[61,679,680,682,684,686,689,691,693],{"class":63,"line":227},[61,681,206],{"class":104},[61,683,209],{"class":108},[61,685,212],{"class":67},[61,687,688],{"class":71}," \"回调函数 on_timer：2 秒到了\"",[61,690,218],{"class":67},[61,692,221],{"class":104},[61,694,224],{"class":108},[61,696,697],{"class":63,"line":232},[61,698,293],{"class":108},[61,700,701],{"class":63,"line":238},[61,702,95],{"emptyLinePlaceholder":94},[61,704,705,707,709],{"class":63,"line":250},[61,706,101],{"class":67},[61,708,105],{"class":104},[61,710,109],{"class":108},[61,712,713],{"class":63,"line":255},[61,714,115],{"class":108},[61,716,717],{"class":63,"line":273},[61,718,122],{"class":121},[61,720,721],{"class":63,"line":278},[61,722,128],{"class":121},[61,724,725,727,729,731],{"class":63,"line":290},[61,726,134],{"class":104},[61,728,137],{"class":108},[61,730,140],{"class":104},[61,732,143],{"class":108},[61,734,736],{"class":63,"line":735},23,[61,737,95],{"emptyLinePlaceholder":94},[61,739,741],{"class":63,"line":740},24,[61,742,154],{"class":121},[61,744,746,748,750,752,754,756,758,760,762,764,766,768,770,772],{"class":63,"line":745},25,[61,747,134],{"class":104},[61,749,137],{"class":108},[61,751,140],{"class":104},[61,753,166],{"class":108},[61,755,169],{"class":104},[61,757,172],{"class":108},[61,759,175],{"class":104},[61,761,137],{"class":108},[61,763,180],{"class":104},[61,765,137],{"class":108},[61,767,185],{"class":104},[61,769,188],{"class":108},[61,771,192],{"class":191},[61,773,195],{"class":108},[61,775,777],{"class":63,"line":776},26,[61,778,95],{"emptyLinePlaceholder":94},[61,780,782,784,786,788,791,793,795],{"class":63,"line":781},27,[61,783,206],{"class":104},[61,785,209],{"class":108},[61,787,212],{"class":67},[61,789,790],{"class":71}," \"main：注册 async_wait\"",[61,792,218],{"class":67},[61,794,221],{"class":104},[61,796,224],{"class":108},[61,798,800],{"class":63,"line":799},28,[61,801,95],{"emptyLinePlaceholder":94},[61,803,805],{"class":63,"line":804},29,[61,806,807],{"class":121},"    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n",[61,809,811,813,816,818,820,822,825,828,830,832,835],{"class":63,"line":810},30,[61,812,241],{"class":108},[61,814,815],{"class":104},"async_wait",[61,817,188],{"class":108},[61,819,175],{"class":104},[61,821,137],{"class":108},[61,823,824],{"class":104},"bind",[61,826,827],{"class":108},"(on_timer, ",[61,829,175],{"class":104},[61,831,137],{"class":108},[61,833,834],{"class":104},"placeholders",[61,836,837],{"class":108},"::_1));\n",[61,839,841],{"class":63,"line":840},31,[61,842,95],{"emptyLinePlaceholder":94},[61,844,846,848,850,852,855,857,859],{"class":63,"line":845},32,[61,847,206],{"class":104},[61,849,209],{"class":108},[61,851,212],{"class":67},[61,853,854],{"class":71}," \"main：async_wait 已经返回，但回调还没执行\"",[61,856,218],{"class":67},[61,858,221],{"class":104},[61,860,224],{"class":108},[61,862,864,866,868,870,873,875,877],{"class":63,"line":863},33,[61,865,206],{"class":104},[61,867,209],{"class":108},[61,869,212],{"class":67},[61,871,872],{"class":71}," \"main：准备调用 io.run()\"",[61,874,218],{"class":67},[61,876,221],{"class":104},[61,878,224],{"class":108},[61,880,882],{"class":63,"line":881},34,[61,883,95],{"emptyLinePlaceholder":94},[61,885,887,890,893],{"class":63,"line":886},35,[61,888,889],{"class":108},"    io.",[61,891,892],{"class":104},"run",[61,894,247],{"class":108},[61,896,898],{"class":63,"line":897},36,[61,899,95],{"emptyLinePlaceholder":94},[61,901,903,905,907,909,912,914,916],{"class":63,"line":902},37,[61,904,206],{"class":104},[61,906,209],{"class":108},[61,908,212],{"class":67},[61,910,911],{"class":71}," \"main：io.run() 返回，程序结束\"",[61,913,218],{"class":67},[61,915,221],{"class":104},[61,917,224],{"class":108},[61,919,921],{"class":63,"line":920},38,[61,922,95],{"emptyLinePlaceholder":94},[61,924,926,928,930],{"class":63,"line":925},39,[61,927,281],{"class":67},[61,929,284],{"class":191},[61,931,287],{"class":108},[61,933,935],{"class":63,"line":934},40,[61,936,293],{"class":108},[13,938,939,300],{},[297,940,299],{},[40,942,304],{"id":943},"compile-and-run-1",[52,945,947],{"className":307,"code":946,"language":309,"meta":57,"style":57},"g++ demo2_async_timer.cpp -o demo2_async_timer -std=c++17 -lboost_system -pthread\n.\u002Fdemo2_async_timer\n",[17,948,949,967],{"__ignoreMap":57},[61,950,951,953,956,958,961,963,965],{"class":63,"line":64},[61,952,316],{"class":104},[61,954,955],{"class":71}," demo2_async_timer.cpp",[61,957,322],{"class":191},[61,959,960],{"class":71}," demo2_async_timer",[61,962,328],{"class":191},[61,964,331],{"class":191},[61,966,334],{"class":191},[61,968,969],{"class":63,"line":75},[61,970,971],{"class":104},".\u002Fdemo2_async_timer\n",[40,973,343],{"id":974},"execution-output-and-chronological-order-1",[13,976,977],{},"The program immediately outputs:",[52,979,982],{"className":980,"code":981,"language":349,"meta":57},[347],"main：注册 async_wait\nmain：async_wait 已经返回，但回调还没执行\nmain：准备调用 io.run()\n",[17,983,981],{"__ignoreMap":57},[13,985,986],{},"Then the program gets stuck at:",[52,988,990],{"className":54,"code":989,"language":56,"meta":57,"style":57},"io.run();\n",[17,991,992],{"__ignoreMap":57},[61,993,994,997,999],{"class":63,"line":64},[61,995,996],{"class":108},"io.",[61,998,892],{"class":104},[61,1000,247],{"class":108},[13,1002,1003],{},"Wait about 2 seconds, then output:",[52,1005,1008],{"className":1006,"code":1007,"language":349,"meta":57},[347],"回调函数 on_timer：2 秒到了\nmain：io.run() 返回，程序结束\n",[17,1009,1007],{"__ignoreMap":57},[13,1011,363],{},[52,1013,1016],{"className":1014,"code":1015,"language":349,"meta":57},[347],"main：注册 async_wait\nmain：async_wait 已经返回，但回调还没执行\nmain：准备调用 io.run()\n回调函数 on_timer：2 秒到了\nmain：io.run() 返回，程序结束\n",[17,1017,1015],{"__ignoreMap":57},[40,1019,373],{"id":1020},"points-to-note-for-this-example-1",[13,1022,1023,1025,1026,492],{},[17,1024,521],{}," does not wait for 2 seconds. It simply registers the event of \"execute callback after 2 seconds\" into ",[17,1027,448],{},[13,1029,1030],{},"What truly awaits:",[52,1032,1033],{"className":54,"code":989,"language":56,"meta":57,"style":57},[17,1034,1035],{"__ignoreMap":57},[61,1036,1037,1039,1041],{"class":63,"line":64},[61,1038,996],{"class":108},[61,1040,892],{"class":104},[61,1042,247],{"class":108},[13,1044,1045,1046,1048],{},"So don't interpret ",[17,1047,521],{}," as an \"asynchronous version of wait.\" More precisely:",[52,1050,1053],{"className":1051,"code":1052,"language":349,"meta":57},[347],"async_wait() = 注册任务\nio.run() = 执行事件循环\non_timer() = 任务完成后的回调\n",[17,1054,1052],{"__ignoreMap":57},[40,1056,1058,1060],{"id":1057},"stdbind-description",[17,1059,26],{}," Description",[13,1062,1063],{},"This line of code:",[52,1065,1067],{"className":54,"code":1066,"language":56,"meta":57,"style":57},"timer.async_wait(std::bind(on_timer, std::placeholders::_1));\n",[17,1068,1069],{"__ignoreMap":57},[61,1070,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091],{"class":63,"line":64},[61,1072,393],{"class":108},[61,1074,815],{"class":104},[61,1076,188],{"class":108},[61,1078,175],{"class":104},[61,1080,137],{"class":108},[61,1082,824],{"class":104},[61,1084,827],{"class":108},[61,1086,175],{"class":104},[61,1088,137],{"class":108},[61,1090,834],{"class":104},[61,1092,837],{"class":108},[13,1094,1095],{},"Meaning:",[52,1097,1100],{"className":1098,"code":1099,"language":349,"meta":57},[347],"当 timer 到期后，Boost.Asio 会传入一个 error_code。\n这个 error_code 会填到 std::placeholders::_1 的位置。\n最后调用 on_timer(ec)。\n",[17,1101,1099],{"__ignoreMap":57},[13,1103,1104,1107],{},[17,1105,1106],{},"on_timer","'s function signature must accept this parameter:",[52,1109,1111],{"className":54,"code":1110,"language":56,"meta":57,"style":57},"void on_timer(const boost::system::error_code& ec)\n",[17,1112,1113],{"__ignoreMap":57},[61,1114,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137],{"class":63,"line":64},[61,1116,491],{"class":67},[61,1118,588],{"class":104},[61,1120,188],{"class":108},[61,1122,593],{"class":67},[61,1124,596],{"class":104},[61,1126,137],{"class":108},[61,1128,601],{"class":104},[61,1130,137],{"class":108},[61,1132,606],{"class":104},[61,1134,609],{"class":67},[61,1136,613],{"class":612},[61,1138,473],{"class":108},[40,1140,404],{"id":1141},"key-function-explanation-1",[406,1143,1145],{"id":1144},"timerasync_waithandler",[17,1146,1147],{},"timer.async_wait(handler)",[13,1149,1150],{},"Purpose: Register an asynchronous wait operation.",[13,1152,1153],{},"Parameter: a callback function object.",[13,1155,488,1156,492],{},[17,1157,491],{},[13,1159,1160],{},"Note: It will not block waiting for the timer to expire.",[406,1162,1164],{"id":1163},"iorun",[17,1165,527],{},[13,1167,1168],{},"Purpose: Start the event loop, handle asynchronous tasks and callback functions.",[13,1170,1171,1172,492],{},"Return value: the number of executed handlers, the type can usually be considered as ",[17,1173,1174],{},"std::size_t",[13,1176,1177,1178,1180],{},"In this example, ",[17,1179,527],{}," executed one callback, so the return value is 1. We just didn't print the return value.",[29,1182],{},[32,1184,1186,1187],{"id":1185},"example-3-writing-two-asynchronous-timers-in-a-common-main","Example 3: Writing two asynchronous timers in a common ",[17,1188,38],{},[40,1190,43],{"id":1191},"program-objective-2",[13,1193,1194],{},"It's hard to perceive the feeling of asynchronous scheduling with just one timer, so this time we'll write two timers:",[511,1196,1197,1203,1209,1215],{},[514,1198,1199,1202],{},[17,1200,1201],{},"timer1"," expires in 1 second;",[514,1204,1205,1208],{},[17,1206,1207],{},"timer2"," expires in 3 seconds;",[514,1210,1211,1212,1214],{},"Both timers are in the same ",[17,1213,448],{},";",[514,1216,1217,1219],{},[17,1218,527],{}," will wait until both tasks are completed before returning.",[40,1221,50],{"id":1222},"full-code-2",[52,1224,1226],{"className":54,"code":1225,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nvoid on_timer(const boost::system::error_code& ec, const std::string& name)\n{\n    if (ec)\n    {\n        std::cout \u003C\u003C name \u003C\u003C \" 被取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return;\n    }\n\n    std::cout \u003C\u003C name \u003C\u003C \" 到期，执行回调\" \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer1(io, std::chrono::seconds(1));\n    boost::asio::steady_timer timer2(io, std::chrono::seconds(3));\n\n    std::cout \u003C\u003C \"main：注册 timer1，1 秒后到期\" \u003C\u003C std::endl;\n    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n    timer1.async_wait(std::bind(on_timer,\n                                std::placeholders::_1,\n                                std::string(\"timer1\")));\n\n    std::cout \u003C\u003C \"main：注册 timer2，3 秒后到期\" \u003C\u003C std::endl;\n    timer2.async_wait(std::bind(on_timer,\n                                std::placeholders::_1,\n                                std::string(\"timer2\")));\n\n    std::cout \u003C\u003C \"main：调用 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,1227,1228,1234,1240,1246,1252,1258,1265,1269,1312,1316,1322,1326,1356,1362,1366,1370,1391,1395,1399,1407,1411,1415,1419,1429,1433,1437,1468,1499,1503,1520,1524,1542,1554,1570,1574,1591,1608,1618,1633,1637,1654,1659,1682,1687,1714,1719,1728],{"__ignoreMap":57},[61,1229,1230,1232],{"class":63,"line":64},[61,1231,68],{"class":67},[61,1233,72],{"class":71},[61,1235,1236,1238],{"class":63,"line":75},[61,1237,68],{"class":67},[61,1239,558],{"class":71},[61,1241,1242,1244],{"class":63,"line":83},[61,1243,68],{"class":67},[61,1245,80],{"class":71},[61,1247,1248,1250],{"class":63,"line":91},[61,1249,68],{"class":67},[61,1251,571],{"class":71},[61,1253,1254,1256],{"class":63,"line":98},[61,1255,68],{"class":67},[61,1257,88],{"class":71},[61,1259,1260,1262],{"class":63,"line":112},[61,1261,68],{"class":67},[61,1263,1264],{"class":71}," \u003Cstring>\n",[61,1266,1267],{"class":63,"line":118},[61,1268,95],{"emptyLinePlaceholder":94},[61,1270,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1296,1298,1300,1302,1305,1307,1310],{"class":63,"line":125},[61,1272,491],{"class":67},[61,1274,588],{"class":104},[61,1276,188],{"class":108},[61,1278,593],{"class":67},[61,1280,596],{"class":104},[61,1282,137],{"class":108},[61,1284,601],{"class":104},[61,1286,137],{"class":108},[61,1288,606],{"class":104},[61,1290,609],{"class":67},[61,1292,613],{"class":612},[61,1294,1295],{"class":108},", ",[61,1297,593],{"class":67},[61,1299,221],{"class":104},[61,1301,137],{"class":108},[61,1303,1304],{"class":104},"string",[61,1306,609],{"class":67},[61,1308,1309],{"class":612}," name",[61,1311,473],{"class":108},[61,1313,1314],{"class":63,"line":131},[61,1315,115],{"class":108},[61,1317,1318,1320],{"class":63,"line":146},[61,1319,624],{"class":67},[61,1321,627],{"class":108},[61,1323,1324],{"class":63,"line":151},[61,1325,632],{"class":108},[61,1327,1328,1330,1332,1334,1337,1339,1342,1344,1346,1348,1350,1352,1354],{"class":63,"line":157},[61,1329,637],{"class":104},[61,1331,209],{"class":108},[61,1333,212],{"class":67},[61,1335,1336],{"class":108}," name ",[61,1338,212],{"class":67},[61,1340,1341],{"class":71}," \" 被取消：\"",[61,1343,218],{"class":67},[61,1345,649],{"class":108},[61,1347,652],{"class":104},[61,1349,655],{"class":108},[61,1351,212],{"class":67},[61,1353,221],{"class":104},[61,1355,224],{"class":108},[61,1357,1358,1360],{"class":63,"line":198},[61,1359,666],{"class":67},[61,1361,287],{"class":108},[61,1363,1364],{"class":63,"line":203},[61,1365,673],{"class":108},[61,1367,1368],{"class":63,"line":227},[61,1369,95],{"emptyLinePlaceholder":94},[61,1371,1372,1374,1376,1378,1380,1382,1385,1387,1389],{"class":63,"line":232},[61,1373,206],{"class":104},[61,1375,209],{"class":108},[61,1377,212],{"class":67},[61,1379,1336],{"class":108},[61,1381,212],{"class":67},[61,1383,1384],{"class":71}," \" 到期，执行回调\"",[61,1386,218],{"class":67},[61,1388,221],{"class":104},[61,1390,224],{"class":108},[61,1392,1393],{"class":63,"line":238},[61,1394,293],{"class":108},[61,1396,1397],{"class":63,"line":250},[61,1398,95],{"emptyLinePlaceholder":94},[61,1400,1401,1403,1405],{"class":63,"line":255},[61,1402,101],{"class":67},[61,1404,105],{"class":104},[61,1406,109],{"class":108},[61,1408,1409],{"class":63,"line":273},[61,1410,115],{"class":108},[61,1412,1413],{"class":63,"line":278},[61,1414,122],{"class":121},[61,1416,1417],{"class":63,"line":290},[61,1418,128],{"class":121},[61,1420,1421,1423,1425,1427],{"class":63,"line":735},[61,1422,134],{"class":104},[61,1424,137],{"class":108},[61,1426,140],{"class":104},[61,1428,143],{"class":108},[61,1430,1431],{"class":63,"line":740},[61,1432,95],{"emptyLinePlaceholder":94},[61,1434,1435],{"class":63,"line":745},[61,1436,154],{"class":121},[61,1438,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1466],{"class":63,"line":776},[61,1440,134],{"class":104},[61,1442,137],{"class":108},[61,1444,140],{"class":104},[61,1446,166],{"class":108},[61,1448,1201],{"class":104},[61,1450,172],{"class":108},[61,1452,175],{"class":104},[61,1454,137],{"class":108},[61,1456,180],{"class":104},[61,1458,137],{"class":108},[61,1460,185],{"class":104},[61,1462,188],{"class":108},[61,1464,1465],{"class":191},"1",[61,1467,195],{"class":108},[61,1469,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1497],{"class":63,"line":781},[61,1471,134],{"class":104},[61,1473,137],{"class":108},[61,1475,140],{"class":104},[61,1477,166],{"class":108},[61,1479,1207],{"class":104},[61,1481,172],{"class":108},[61,1483,175],{"class":104},[61,1485,137],{"class":108},[61,1487,180],{"class":104},[61,1489,137],{"class":108},[61,1491,185],{"class":104},[61,1493,188],{"class":108},[61,1495,1496],{"class":191},"3",[61,1498,195],{"class":108},[61,1500,1501],{"class":63,"line":799},[61,1502,95],{"emptyLinePlaceholder":94},[61,1504,1505,1507,1509,1511,1514,1516,1518],{"class":63,"line":804},[61,1506,206],{"class":104},[61,1508,209],{"class":108},[61,1510,212],{"class":67},[61,1512,1513],{"class":71}," \"main：注册 timer1，1 秒后到期\"",[61,1515,218],{"class":67},[61,1517,221],{"class":104},[61,1519,224],{"class":108},[61,1521,1522],{"class":63,"line":810},[61,1523,807],{"class":121},[61,1525,1526,1529,1531,1533,1535,1537,1539],{"class":63,"line":840},[61,1527,1528],{"class":108},"    timer1.",[61,1530,815],{"class":104},[61,1532,188],{"class":108},[61,1534,175],{"class":104},[61,1536,137],{"class":108},[61,1538,824],{"class":104},[61,1540,1541],{"class":108},"(on_timer,\n",[61,1543,1544,1547,1549,1551],{"class":63,"line":845},[61,1545,1546],{"class":104},"                                std",[61,1548,137],{"class":108},[61,1550,834],{"class":104},[61,1552,1553],{"class":108},"::_1,\n",[61,1555,1556,1558,1560,1562,1564,1567],{"class":63,"line":863},[61,1557,1546],{"class":104},[61,1559,137],{"class":108},[61,1561,1304],{"class":104},[61,1563,188],{"class":108},[61,1565,1566],{"class":71},"\"timer1\"",[61,1568,1569],{"class":108},")));\n",[61,1571,1572],{"class":63,"line":881},[61,1573,95],{"emptyLinePlaceholder":94},[61,1575,1576,1578,1580,1582,1585,1587,1589],{"class":63,"line":886},[61,1577,206],{"class":104},[61,1579,209],{"class":108},[61,1581,212],{"class":67},[61,1583,1584],{"class":71}," \"main：注册 timer2，3 秒后到期\"",[61,1586,218],{"class":67},[61,1588,221],{"class":104},[61,1590,224],{"class":108},[61,1592,1593,1596,1598,1600,1602,1604,1606],{"class":63,"line":897},[61,1594,1595],{"class":108},"    timer2.",[61,1597,815],{"class":104},[61,1599,188],{"class":108},[61,1601,175],{"class":104},[61,1603,137],{"class":108},[61,1605,824],{"class":104},[61,1607,1541],{"class":108},[61,1609,1610,1612,1614,1616],{"class":63,"line":902},[61,1611,1546],{"class":104},[61,1613,137],{"class":108},[61,1615,834],{"class":104},[61,1617,1553],{"class":108},[61,1619,1620,1622,1624,1626,1628,1631],{"class":63,"line":920},[61,1621,1546],{"class":104},[61,1623,137],{"class":108},[61,1625,1304],{"class":104},[61,1627,188],{"class":108},[61,1629,1630],{"class":71},"\"timer2\"",[61,1632,1569],{"class":108},[61,1634,1635],{"class":63,"line":925},[61,1636,95],{"emptyLinePlaceholder":94},[61,1638,1639,1641,1643,1645,1648,1650,1652],{"class":63,"line":934},[61,1640,206],{"class":104},[61,1642,209],{"class":108},[61,1644,212],{"class":67},[61,1646,1647],{"class":71}," \"main：调用 io.run()\"",[61,1649,218],{"class":67},[61,1651,221],{"class":104},[61,1653,224],{"class":108},[61,1655,1657],{"class":63,"line":1656},41,[61,1658,95],{"emptyLinePlaceholder":94},[61,1660,1662,1664,1666,1669,1672,1675,1678,1680],{"class":63,"line":1661},42,[61,1663,206],{"class":104},[61,1665,137],{"class":108},[61,1667,1668],{"class":67},"size_t",[61,1670,1671],{"class":108}," count ",[61,1673,1674],{"class":67},"=",[61,1676,1677],{"class":108}," io.",[61,1679,892],{"class":104},[61,1681,247],{"class":108},[61,1683,1685],{"class":63,"line":1684},43,[61,1686,95],{"emptyLinePlaceholder":94},[61,1688,1690,1692,1694,1696,1699,1701,1703,1705,1708,1710,1712],{"class":63,"line":1689},44,[61,1691,206],{"class":104},[61,1693,209],{"class":108},[61,1695,212],{"class":67},[61,1697,1698],{"class":71}," \"main：io.run() 返回，一共执行了 \"",[61,1700,218],{"class":67},[61,1702,1671],{"class":108},[61,1704,212],{"class":67},[61,1706,1707],{"class":71}," \" 个回调\"",[61,1709,218],{"class":67},[61,1711,221],{"class":104},[61,1713,224],{"class":108},[61,1715,1717],{"class":63,"line":1716},45,[61,1718,95],{"emptyLinePlaceholder":94},[61,1720,1722,1724,1726],{"class":63,"line":1721},46,[61,1723,281],{"class":67},[61,1725,284],{"class":191},[61,1727,287],{"class":108},[61,1729,1731],{"class":63,"line":1730},47,[61,1732,293],{"class":108},[13,1734,1735,300],{},[297,1736,299],{},[40,1738,304],{"id":1739},"compile-and-run-2",[52,1741,1743],{"className":307,"code":1742,"language":309,"meta":57,"style":57},"g++ demo3_two_timers.cpp -o demo3_two_timers -std=c++17 -lboost_system -pthread\n.\u002Fdemo3_two_timers\n",[17,1744,1745,1763],{"__ignoreMap":57},[61,1746,1747,1749,1752,1754,1757,1759,1761],{"class":63,"line":64},[61,1748,316],{"class":104},[61,1750,1751],{"class":71}," demo3_two_timers.cpp",[61,1753,322],{"class":191},[61,1755,1756],{"class":71}," demo3_two_timers",[61,1758,328],{"class":191},[61,1760,331],{"class":191},[61,1762,334],{"class":191},[61,1764,1765],{"class":63,"line":75},[61,1766,1767],{"class":104},".\u002Fdemo3_two_timers\n",[40,1769,343],{"id":1770},"execution-output-and-chronological-order-2",[13,1772,977],{},[52,1774,1777],{"className":1775,"code":1776,"language":349,"meta":57},[347],"main：注册 timer1，1 秒后到期\nmain：注册 timer2，3 秒后到期\nmain：调用 io.run()\n",[17,1778,1776],{"__ignoreMap":57},[13,1780,1781],{},"Output in about 1 second:",[52,1783,1786],{"className":1784,"code":1785,"language":349,"meta":57},[347],"timer1 到期，执行回调\n",[17,1787,1785],{"__ignoreMap":57},[13,1789,1790],{},"After about another 2 seconds, i.e., about 3 seconds after program startup, output:",[52,1792,1795],{"className":1793,"code":1794,"language":349,"meta":57},[347],"timer2 到期，执行回调\nmain：io.run() 返回，一共执行了 2 个回调\n",[17,1796,1794],{"__ignoreMap":57},[13,1798,363],{},[52,1800,1803],{"className":1801,"code":1802,"language":349,"meta":57},[347],"main：注册 timer1，1 秒后到期\nmain：注册 timer2，3 秒后到期\nmain：调用 io.run()\ntimer1 到期，执行回调\ntimer2 到期，执行回调\nmain：io.run() 返回，一共执行了 2 个回调\n",[17,1804,1802],{"__ignoreMap":57},[40,1806,373],{"id":1807},"points-to-note-for-this-example-2",[13,1809,1810],{},"Two timers are not two threads.",[13,1812,1813,1814,1816,1817,1819,1820,492],{},"This example has only one thread, which is the main thread. The callbacks of ",[17,1815,1201],{}," and ",[17,1818,1207],{}," are both executed in this main thread that calls ",[17,1821,527],{},[13,1823,1824],{},"The actual execution order is:",[52,1826,1829],{"className":1827,"code":1828,"language":349,"meta":57},[347],"主线程进入 io.run()\n等待事件\ntimer1 先到期 -> 调用 timer1 回调\n继续等待事件\ntimer2 后到期 -> 调用 timer2 回调\n没有任务了 -> io.run() 返回\n",[17,1830,1828],{"__ignoreMap":57},[40,1832,1834,1835],{"id":1833},"fixed-parameters-in-stdbind","Fixed parameters in ",[17,1836,26],{},[13,1838,1839],{},"This sentence:",[52,1841,1843],{"className":54,"code":1842,"language":56,"meta":57,"style":57},"std::bind(on_timer, std::placeholders::_1, std::string(\"timer1\"))\n",[17,1844,1845],{"__ignoreMap":57},[61,1846,1847,1849,1851,1853,1855,1857,1859,1861,1864,1866,1868,1870,1872,1874],{"class":63,"line":64},[61,1848,175],{"class":104},[61,1850,137],{"class":108},[61,1852,824],{"class":104},[61,1854,827],{"class":108},[61,1856,175],{"class":104},[61,1858,137],{"class":108},[61,1860,834],{"class":104},[61,1862,1863],{"class":108},"::_1, ",[61,1865,175],{"class":104},[61,1867,137],{"class":108},[61,1869,1304],{"class":104},[61,1871,188],{"class":108},[61,1873,1566],{"class":71},[61,1875,1876],{"class":108},"))\n",[13,1878,1879],{},"Equivalent to preparing a function object in advance:",[52,1881,1884],{"className":1882,"code":1883,"language":349,"meta":57},[347],"未来 Asio 传入 ec 时，调用 on_timer(ec, \"timer1\")。\n",[17,1885,1883],{"__ignoreMap":57},[13,1887,1888,1891],{},[17,1889,1890],{},"_1"," is the error code that will be passed in by Asio in the future.",[13,1893,1894,1896],{},[17,1895,1566],{}," is a parameter that is fixed right now.",[29,1898],{},[32,1900,1902,1903],{"id":1901},"example-4-writing-a-repeating-timer-in-a-normal-main","Example 4: Writing a repeating timer in a normal ",[17,1904,38],{},[40,1906,43],{"id":1907},"program-objective-3",[13,1909,1910],{},"Implement a timer that prints once every 1 second, and ends after printing 5 times.",[13,1912,1913],{},"This example is very similar to a periodic task in a robot, for example:",[52,1915,1918],{"className":1916,"code":1917,"language":349,"meta":57},[347],"每 20ms 发送一次速度命令\n每 100ms 检查一次下位机心跳\n每 1s 打印一次通信状态\n",[17,1919,1917],{"__ignoreMap":57},[40,1921,50],{"id":1922},"full-code-3",[52,1924,1926],{"className":54,"code":1925,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n\nvoid repeat_timer(const boost::system::error_code& ec,\n                  boost::asio::steady_timer* timer,\n                  int* count)\n{\n    if (ec)\n    {\n        std::cout \u003C\u003C \"repeat_timer 被取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return;\n    }\n\n    ++(*count);\n    std::cout \u003C\u003C \"第 \" \u003C\u003C *count \u003C\u003C \" 次定时器回调\" \u003C\u003C std::endl;\n\n    if (*count \u003C 5)\n    {\n        timer->expires_after(std::chrono::seconds(1));\n        timer->async_wait(std::bind(repeat_timer,\n                                    std::placeholders::_1,\n                                    timer,\n                                    count));\n    }\n    else\n    {\n        std::cout \u003C\u003C \"已经执行 5 次，不再重新注册定时器\" \u003C\u003C std::endl;\n    }\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer(io, std::chrono::seconds(1));\n    int count = 0;\n\n    std::cout \u003C\u003C \"main：注册第 1 次定时器\" \u003C\u003C std::endl;\n\n    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n    timer.async_wait(std::bind(repeat_timer,\n                               std::placeholders::_1,\n                               &timer,\n                               &count));\n\n    io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回，程序结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,1927,1928,1934,1940,1946,1952,1958,1962,1990,2012,2022,2026,2032,2036,2061,2067,2071,2075,2087,2117,2121,2140,2144,2170,2187,2198,2203,2208,2212,2217,2221,2238,2242,2246,2250,2258,2262,2266,2270,2280,2284,2314,2327,2331,2348,2352,2356,2372,2383,2392,2400,2405,2414,2419,2436,2441,2450],{"__ignoreMap":57},[61,1929,1930,1932],{"class":63,"line":64},[61,1931,68],{"class":67},[61,1933,72],{"class":71},[61,1935,1936,1938],{"class":63,"line":75},[61,1937,68],{"class":67},[61,1939,558],{"class":71},[61,1941,1942,1944],{"class":63,"line":83},[61,1943,68],{"class":67},[61,1945,80],{"class":71},[61,1947,1948,1950],{"class":63,"line":91},[61,1949,68],{"class":67},[61,1951,571],{"class":71},[61,1953,1954,1956],{"class":63,"line":98},[61,1955,68],{"class":67},[61,1957,88],{"class":71},[61,1959,1960],{"class":63,"line":112},[61,1961,95],{"emptyLinePlaceholder":94},[61,1963,1964,1966,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987],{"class":63,"line":118},[61,1965,491],{"class":67},[61,1967,1968],{"class":104}," repeat_timer",[61,1970,188],{"class":108},[61,1972,593],{"class":67},[61,1974,596],{"class":104},[61,1976,137],{"class":108},[61,1978,601],{"class":104},[61,1980,137],{"class":108},[61,1982,606],{"class":104},[61,1984,609],{"class":67},[61,1986,613],{"class":612},[61,1988,1989],{"class":108},",\n",[61,1991,1992,1995,1997,1999,2001,2004,2007,2010],{"class":63,"line":125},[61,1993,1994],{"class":104},"                  boost",[61,1996,137],{"class":108},[61,1998,140],{"class":104},[61,2000,137],{"class":108},[61,2002,2003],{"class":104},"steady_timer",[61,2005,2006],{"class":67},"*",[61,2008,2009],{"class":612}," timer",[61,2011,1989],{"class":108},[61,2013,2014,2017,2020],{"class":63,"line":131},[61,2015,2016],{"class":67},"                  int*",[61,2018,2019],{"class":612}," count",[61,2021,473],{"class":108},[61,2023,2024],{"class":63,"line":146},[61,2025,115],{"class":108},[61,2027,2028,2030],{"class":63,"line":151},[61,2029,624],{"class":67},[61,2031,627],{"class":108},[61,2033,2034],{"class":63,"line":157},[61,2035,632],{"class":108},[61,2037,2038,2040,2042,2044,2047,2049,2051,2053,2055,2057,2059],{"class":63,"line":198},[61,2039,637],{"class":104},[61,2041,209],{"class":108},[61,2043,212],{"class":67},[61,2045,2046],{"class":71}," \"repeat_timer 被取消：\"",[61,2048,218],{"class":67},[61,2050,649],{"class":108},[61,2052,652],{"class":104},[61,2054,655],{"class":108},[61,2056,212],{"class":67},[61,2058,221],{"class":104},[61,2060,224],{"class":108},[61,2062,2063,2065],{"class":63,"line":203},[61,2064,666],{"class":67},[61,2066,287],{"class":108},[61,2068,2069],{"class":63,"line":227},[61,2070,673],{"class":108},[61,2072,2073],{"class":63,"line":232},[61,2074,95],{"emptyLinePlaceholder":94},[61,2076,2077,2080,2082,2084],{"class":63,"line":238},[61,2078,2079],{"class":67},"    ++",[61,2081,188],{"class":108},[61,2083,2006],{"class":67},[61,2085,2086],{"class":108},"count);\n",[61,2088,2089,2091,2093,2095,2098,2100,2103,2106,2108,2111,2113,2115],{"class":63,"line":250},[61,2090,206],{"class":104},[61,2092,209],{"class":108},[61,2094,212],{"class":67},[61,2096,2097],{"class":71}," \"第 \"",[61,2099,218],{"class":67},[61,2101,2102],{"class":67}," *",[61,2104,2105],{"class":108},"count ",[61,2107,212],{"class":67},[61,2109,2110],{"class":71}," \" 次定时器回调\"",[61,2112,218],{"class":67},[61,2114,221],{"class":104},[61,2116,224],{"class":108},[61,2118,2119],{"class":63,"line":255},[61,2120,95],{"emptyLinePlaceholder":94},[61,2122,2123,2125,2128,2130,2132,2135,2138],{"class":63,"line":273},[61,2124,624],{"class":67},[61,2126,2127],{"class":108}," (",[61,2129,2006],{"class":67},[61,2131,2105],{"class":108},[61,2133,2134],{"class":67},"\u003C",[61,2136,2137],{"class":191}," 5",[61,2139,473],{"class":108},[61,2141,2142],{"class":63,"line":278},[61,2143,632],{"class":108},[61,2145,2146,2149,2152,2154,2156,2158,2160,2162,2164,2166,2168],{"class":63,"line":290},[61,2147,2148],{"class":108},"        timer->",[61,2150,2151],{"class":104},"expires_after",[61,2153,188],{"class":108},[61,2155,175],{"class":104},[61,2157,137],{"class":108},[61,2159,180],{"class":104},[61,2161,137],{"class":108},[61,2163,185],{"class":104},[61,2165,188],{"class":108},[61,2167,1465],{"class":191},[61,2169,195],{"class":108},[61,2171,2172,2174,2176,2178,2180,2182,2184],{"class":63,"line":735},[61,2173,2148],{"class":108},[61,2175,815],{"class":104},[61,2177,188],{"class":108},[61,2179,175],{"class":104},[61,2181,137],{"class":108},[61,2183,824],{"class":104},[61,2185,2186],{"class":108},"(repeat_timer,\n",[61,2188,2189,2192,2194,2196],{"class":63,"line":740},[61,2190,2191],{"class":104},"                                    std",[61,2193,137],{"class":108},[61,2195,834],{"class":104},[61,2197,1553],{"class":108},[61,2199,2200],{"class":63,"line":745},[61,2201,2202],{"class":108},"                                    timer,\n",[61,2204,2205],{"class":63,"line":776},[61,2206,2207],{"class":108},"                                    count));\n",[61,2209,2210],{"class":63,"line":781},[61,2211,673],{"class":108},[61,2213,2214],{"class":63,"line":799},[61,2215,2216],{"class":67},"    else\n",[61,2218,2219],{"class":63,"line":804},[61,2220,632],{"class":108},[61,2222,2223,2225,2227,2229,2232,2234,2236],{"class":63,"line":810},[61,2224,637],{"class":104},[61,2226,209],{"class":108},[61,2228,212],{"class":67},[61,2230,2231],{"class":71}," \"已经执行 5 次，不再重新注册定时器\"",[61,2233,218],{"class":67},[61,2235,221],{"class":104},[61,2237,224],{"class":108},[61,2239,2240],{"class":63,"line":840},[61,2241,673],{"class":108},[61,2243,2244],{"class":63,"line":845},[61,2245,293],{"class":108},[61,2247,2248],{"class":63,"line":863},[61,2249,95],{"emptyLinePlaceholder":94},[61,2251,2252,2254,2256],{"class":63,"line":881},[61,2253,101],{"class":67},[61,2255,105],{"class":104},[61,2257,109],{"class":108},[61,2259,2260],{"class":63,"line":886},[61,2261,115],{"class":108},[61,2263,2264],{"class":63,"line":897},[61,2265,122],{"class":121},[61,2267,2268],{"class":63,"line":902},[61,2269,128],{"class":121},[61,2271,2272,2274,2276,2278],{"class":63,"line":920},[61,2273,134],{"class":104},[61,2275,137],{"class":108},[61,2277,140],{"class":104},[61,2279,143],{"class":108},[61,2281,2282],{"class":63,"line":925},[61,2283,154],{"class":121},[61,2285,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312],{"class":63,"line":934},[61,2287,134],{"class":104},[61,2289,137],{"class":108},[61,2291,140],{"class":104},[61,2293,166],{"class":108},[61,2295,169],{"class":104},[61,2297,172],{"class":108},[61,2299,175],{"class":104},[61,2301,137],{"class":108},[61,2303,180],{"class":104},[61,2305,137],{"class":108},[61,2307,185],{"class":104},[61,2309,188],{"class":108},[61,2311,1465],{"class":191},[61,2313,195],{"class":108},[61,2315,2316,2319,2321,2323,2325],{"class":63,"line":1656},[61,2317,2318],{"class":67},"    int",[61,2320,1671],{"class":108},[61,2322,1674],{"class":67},[61,2324,284],{"class":191},[61,2326,287],{"class":108},[61,2328,2329],{"class":63,"line":1661},[61,2330,95],{"emptyLinePlaceholder":94},[61,2332,2333,2335,2337,2339,2342,2344,2346],{"class":63,"line":1684},[61,2334,206],{"class":104},[61,2336,209],{"class":108},[61,2338,212],{"class":67},[61,2340,2341],{"class":71}," \"main：注册第 1 次定时器\"",[61,2343,218],{"class":67},[61,2345,221],{"class":104},[61,2347,224],{"class":108},[61,2349,2350],{"class":63,"line":1689},[61,2351,95],{"emptyLinePlaceholder":94},[61,2353,2354],{"class":63,"line":1716},[61,2355,807],{"class":121},[61,2357,2358,2360,2362,2364,2366,2368,2370],{"class":63,"line":1721},[61,2359,241],{"class":108},[61,2361,815],{"class":104},[61,2363,188],{"class":108},[61,2365,175],{"class":104},[61,2367,137],{"class":108},[61,2369,824],{"class":104},[61,2371,2186],{"class":108},[61,2373,2374,2377,2379,2381],{"class":63,"line":1730},[61,2375,2376],{"class":104},"                               std",[61,2378,137],{"class":108},[61,2380,834],{"class":104},[61,2382,1553],{"class":108},[61,2384,2386,2389],{"class":63,"line":2385},48,[61,2387,2388],{"class":67},"                               &",[61,2390,2391],{"class":108},"timer,\n",[61,2393,2395,2397],{"class":63,"line":2394},49,[61,2396,2388],{"class":67},[61,2398,2399],{"class":108},"count));\n",[61,2401,2403],{"class":63,"line":2402},50,[61,2404,95],{"emptyLinePlaceholder":94},[61,2406,2408,2410,2412],{"class":63,"line":2407},51,[61,2409,889],{"class":108},[61,2411,892],{"class":104},[61,2413,247],{"class":108},[61,2415,2417],{"class":63,"line":2416},52,[61,2418,95],{"emptyLinePlaceholder":94},[61,2420,2422,2424,2426,2428,2430,2432,2434],{"class":63,"line":2421},53,[61,2423,206],{"class":104},[61,2425,209],{"class":108},[61,2427,212],{"class":67},[61,2429,911],{"class":71},[61,2431,218],{"class":67},[61,2433,221],{"class":104},[61,2435,224],{"class":108},[61,2437,2439],{"class":63,"line":2438},54,[61,2440,95],{"emptyLinePlaceholder":94},[61,2442,2444,2446,2448],{"class":63,"line":2443},55,[61,2445,281],{"class":67},[61,2447,284],{"class":191},[61,2449,287],{"class":108},[61,2451,2453],{"class":63,"line":2452},56,[61,2454,293],{"class":108},[13,2456,2457,300],{},[297,2458,299],{},[40,2460,304],{"id":2461},"compile-and-run-3",[52,2463,2465],{"className":307,"code":2464,"language":309,"meta":57,"style":57},"g++ demo4_repeat_timer.cpp -o demo4_repeat_timer -std=c++17 -lboost_system -pthread\n.\u002Fdemo4_repeat_timer\n",[17,2466,2467,2485],{"__ignoreMap":57},[61,2468,2469,2471,2474,2476,2479,2481,2483],{"class":63,"line":64},[61,2470,316],{"class":104},[61,2472,2473],{"class":71}," demo4_repeat_timer.cpp",[61,2475,322],{"class":191},[61,2477,2478],{"class":71}," demo4_repeat_timer",[61,2480,328],{"class":191},[61,2482,331],{"class":191},[61,2484,334],{"class":191},[61,2486,2487],{"class":63,"line":75},[61,2488,2489],{"class":104},".\u002Fdemo4_repeat_timer\n",[40,2491,343],{"id":2492},"execution-output-and-chronological-order-3",[13,2494,977],{},[52,2496,2499],{"className":2497,"code":2498,"language":349,"meta":57},[347],"main：注册第 1 次定时器\n",[17,2500,2498],{"__ignoreMap":57},[13,2502,2503],{},"About 1 second later:",[52,2505,2508],{"className":2506,"code":2507,"language":349,"meta":57},[347],"第 1 次定时器回调\n",[17,2509,2507],{"__ignoreMap":57},[13,2511,2512],{},"Then output approximately every 1 second:",[52,2514,2517],{"className":2515,"code":2516,"language":349,"meta":57},[347],"第 2 次定时器回调\n第 3 次定时器回调\n第 4 次定时器回调\n第 5 次定时器回调\n已经执行 5 次，不再重新注册定时器\nmain：io.run() 返回，程序结束\n",[17,2518,2516],{"__ignoreMap":57},[13,2520,363],{},[52,2522,2525],{"className":2523,"code":2524,"language":349,"meta":57},[347],"main：注册第 1 次定时器\n第 1 次定时器回调\n第 2 次定时器回调\n第 3 次定时器回调\n第 4 次定时器回调\n第 5 次定时器回调\n已经执行 5 次，不再重新注册定时器\nmain：io.run() 返回，程序结束\n",[17,2526,2524],{"__ignoreMap":57},[40,2528,373],{"id":2529},"points-to-note-for-this-example-3",[13,2531,2532,2533,2536,2537,492],{},"The repeating timer is not inside the ",[17,2534,2535],{},"while"," loop ",[17,2538,2539],{},"sleep",[13,2541,2542],{},"The asynchronous syntax is:",[52,2544,2547],{"className":2545,"code":2546,"language":349,"meta":57},[347],"第一次 async_wait\n第 1 次回调里重新设置 expires_after\n第 1 次回调里再次 async_wait\n第 2 次回调里再次注册\n……\n",[17,2548,2546],{"__ignoreMap":57},[13,2550,2551],{},"That is, “before each callback ends, decide whether to register the next one.”",[40,2553,2555],{"id":2554},"pointer-lifecycle-explanation","Pointer Lifecycle Explanation",[13,2557,2558],{},"In this example, passed:",[52,2560,2562],{"className":54,"code":2561,"language":56,"meta":57,"style":57},"&timer\n&count\n",[17,2563,2564,2571],{"__ignoreMap":57},[61,2565,2566,2568],{"class":63,"line":64},[61,2567,609],{"class":67},[61,2569,2570],{"class":108},"timer\n",[61,2572,2573,2575],{"class":63,"line":75},[61,2574,609],{"class":67},[61,2576,2577],{"class":108},"count\n",[13,2579,2580,2581,2584],{},"This is to allow ",[17,2582,2583],{},"repeat_timer()"," to modify the same timer and count.",[13,2586,2587],{},"This way of writing is safe in this example because:",[52,2589,2592],{"className":2590,"code":2591,"language":349,"meta":57},[347],"timer 和 count 都是 main() 里的局部变量\nmain() 会卡在 io.run()\nio.run() 返回前，timer 和 count 都不会析构\n",[17,2593,2591],{"__ignoreMap":57},[13,2595,2596],{},"However, in engineering it is more recommended to encapsulate it into a class; see the next example.",[29,2598],{},[32,2600,2602],{"id":2601},"example-5-writing-a-single-asynchronous-timer-in-a-class","Example 5: Writing a Single Asynchronous Timer in a Class",[40,2604,43],{"id":2605},"program-objective-4",[13,2607,2608],{},"Convert Example 2 to a class-encapsulated version.",[13,2610,2611],{},"Class encapsulation is a more common approach in robot projects, for example:",[52,2613,2616],{"className":2614,"code":2615,"language":349,"meta":57},[347],"SerialDriver 类\nTcpClient 类\nUdpReceiver 类\nRobotController 类\n",[17,2617,2615],{"__ignoreMap":57},[40,2619,50],{"id":2620},"full-code-4",[52,2622,2624],{"className":54,"code":2623,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n\nclass Printer\n{\npublic:\n    explicit Printer(boost::asio::io_context& io)\n        : timer_(io, std::chrono::seconds(2))\n    {\n        std::cout \u003C\u003C \"Printer 构造：注册 2 秒定时器\" \u003C\u003C std::endl;\n\n        \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n        timer_.async_wait(std::bind(&Printer::on_timer,\n                                    this,\n                                    std::placeholders::_1));\n    }\n\nprivate:\n    void on_timer(const boost::system::error_code& ec)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"Printer::on_timer 被取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"Printer::on_timer：2 秒到了\" \u003C\u003C std::endl;\n    }\n\nprivate:\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer_;\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    Printer printer(io);\n\n    std::cout \u003C\u003C \"main：准备调用 io.run()\" \u003C\u003C std::endl;\n\n    io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,2625,2626,2632,2638,2644,2650,2656,2660,2668,2672,2677,2705,2731,2735,2752,2756,2761,2786,2793,2803,2807,2811,2816,2843,2847,2854,2859,2885,2892,2897,2901,2918,2922,2926,2930,2934,2945,2950,2954,2962,2966,2970,2974,2984,2988,2999,3003,3019,3023,3031,3035,3052,3056,3064],{"__ignoreMap":57},[61,2627,2628,2630],{"class":63,"line":64},[61,2629,68],{"class":67},[61,2631,72],{"class":71},[61,2633,2634,2636],{"class":63,"line":75},[61,2635,68],{"class":67},[61,2637,558],{"class":71},[61,2639,2640,2642],{"class":63,"line":83},[61,2641,68],{"class":67},[61,2643,80],{"class":71},[61,2645,2646,2648],{"class":63,"line":91},[61,2647,68],{"class":67},[61,2649,571],{"class":71},[61,2651,2652,2654],{"class":63,"line":98},[61,2653,68],{"class":67},[61,2655,88],{"class":71},[61,2657,2658],{"class":63,"line":112},[61,2659,95],{"emptyLinePlaceholder":94},[61,2661,2662,2665],{"class":63,"line":118},[61,2663,2664],{"class":67},"class",[61,2666,2667],{"class":104}," Printer\n",[61,2669,2670],{"class":63,"line":125},[61,2671,115],{"class":108},[61,2673,2674],{"class":63,"line":131},[61,2675,2676],{"class":67},"public:\n",[61,2678,2679,2682,2685,2687,2690,2692,2694,2696,2698,2700,2703],{"class":63,"line":146},[61,2680,2681],{"class":67},"    explicit",[61,2683,2684],{"class":104}," Printer",[61,2686,188],{"class":108},[61,2688,2689],{"class":104},"boost",[61,2691,137],{"class":108},[61,2693,140],{"class":104},[61,2695,137],{"class":108},[61,2697,448],{"class":104},[61,2699,609],{"class":67},[61,2701,2702],{"class":612}," io",[61,2704,473],{"class":108},[61,2706,2707,2710,2713,2715,2717,2719,2721,2723,2725,2727,2729],{"class":63,"line":151},[61,2708,2709],{"class":108},"        : ",[61,2711,2712],{"class":104},"timer_",[61,2714,172],{"class":108},[61,2716,175],{"class":104},[61,2718,137],{"class":108},[61,2720,180],{"class":104},[61,2722,137],{"class":108},[61,2724,185],{"class":104},[61,2726,188],{"class":108},[61,2728,192],{"class":191},[61,2730,1876],{"class":108},[61,2732,2733],{"class":63,"line":157},[61,2734,632],{"class":108},[61,2736,2737,2739,2741,2743,2746,2748,2750],{"class":63,"line":198},[61,2738,637],{"class":104},[61,2740,209],{"class":108},[61,2742,212],{"class":67},[61,2744,2745],{"class":71}," \"Printer 构造：注册 2 秒定时器\"",[61,2747,218],{"class":67},[61,2749,221],{"class":104},[61,2751,224],{"class":108},[61,2753,2754],{"class":63,"line":203},[61,2755,95],{"emptyLinePlaceholder":94},[61,2757,2758],{"class":63,"line":227},[61,2759,2760],{"class":121},"        \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n",[61,2762,2763,2766,2768,2770,2772,2774,2776,2778,2780,2783],{"class":63,"line":232},[61,2764,2765],{"class":108},"        timer_.",[61,2767,815],{"class":104},[61,2769,188],{"class":108},[61,2771,175],{"class":104},[61,2773,137],{"class":108},[61,2775,824],{"class":104},[61,2777,188],{"class":108},[61,2779,609],{"class":67},[61,2781,2782],{"class":104},"Printer",[61,2784,2785],{"class":108},"::on_timer,\n",[61,2787,2788,2791],{"class":63,"line":238},[61,2789,2790],{"class":191},"                                    this",[61,2792,1989],{"class":108},[61,2794,2795,2797,2799,2801],{"class":63,"line":250},[61,2796,2191],{"class":104},[61,2798,137],{"class":108},[61,2800,834],{"class":104},[61,2802,837],{"class":108},[61,2804,2805],{"class":63,"line":255},[61,2806,673],{"class":108},[61,2808,2809],{"class":63,"line":273},[61,2810,95],{"emptyLinePlaceholder":94},[61,2812,2813],{"class":63,"line":278},[61,2814,2815],{"class":67},"private:\n",[61,2817,2818,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841],{"class":63,"line":290},[61,2819,2820],{"class":67},"    void",[61,2822,588],{"class":104},[61,2824,188],{"class":108},[61,2826,593],{"class":67},[61,2828,596],{"class":104},[61,2830,137],{"class":108},[61,2832,601],{"class":104},[61,2834,137],{"class":108},[61,2836,606],{"class":104},[61,2838,609],{"class":67},[61,2840,613],{"class":612},[61,2842,473],{"class":108},[61,2844,2845],{"class":63,"line":735},[61,2846,632],{"class":108},[61,2848,2849,2852],{"class":63,"line":740},[61,2850,2851],{"class":67},"        if",[61,2853,627],{"class":108},[61,2855,2856],{"class":63,"line":745},[61,2857,2858],{"class":108},"        {\n",[61,2860,2861,2864,2866,2868,2871,2873,2875,2877,2879,2881,2883],{"class":63,"line":776},[61,2862,2863],{"class":104},"            std",[61,2865,209],{"class":108},[61,2867,212],{"class":67},[61,2869,2870],{"class":71}," \"Printer::on_timer 被取消：\"",[61,2872,218],{"class":67},[61,2874,649],{"class":108},[61,2876,652],{"class":104},[61,2878,655],{"class":108},[61,2880,212],{"class":67},[61,2882,221],{"class":104},[61,2884,224],{"class":108},[61,2886,2887,2890],{"class":63,"line":781},[61,2888,2889],{"class":67},"            return",[61,2891,287],{"class":108},[61,2893,2894],{"class":63,"line":799},[61,2895,2896],{"class":108},"        }\n",[61,2898,2899],{"class":63,"line":804},[61,2900,95],{"emptyLinePlaceholder":94},[61,2902,2903,2905,2907,2909,2912,2914,2916],{"class":63,"line":810},[61,2904,637],{"class":104},[61,2906,209],{"class":108},[61,2908,212],{"class":67},[61,2910,2911],{"class":71}," \"Printer::on_timer：2 秒到了\"",[61,2913,218],{"class":67},[61,2915,221],{"class":104},[61,2917,224],{"class":108},[61,2919,2920],{"class":63,"line":840},[61,2921,673],{"class":108},[61,2923,2924],{"class":63,"line":845},[61,2925,95],{"emptyLinePlaceholder":94},[61,2927,2928],{"class":63,"line":863},[61,2929,2815],{"class":67},[61,2931,2932],{"class":63,"line":881},[61,2933,154],{"class":121},[61,2935,2936,2938,2940,2942],{"class":63,"line":886},[61,2937,134],{"class":104},[61,2939,137],{"class":108},[61,2941,140],{"class":104},[61,2943,2944],{"class":108},"::steady_timer timer_;\n",[61,2946,2947],{"class":63,"line":897},[61,2948,2949],{"class":108},"};\n",[61,2951,2952],{"class":63,"line":902},[61,2953,95],{"emptyLinePlaceholder":94},[61,2955,2956,2958,2960],{"class":63,"line":920},[61,2957,101],{"class":67},[61,2959,105],{"class":104},[61,2961,109],{"class":108},[61,2963,2964],{"class":63,"line":925},[61,2965,115],{"class":108},[61,2967,2968],{"class":63,"line":934},[61,2969,122],{"class":121},[61,2971,2972],{"class":63,"line":1656},[61,2973,128],{"class":121},[61,2975,2976,2978,2980,2982],{"class":63,"line":1661},[61,2977,134],{"class":104},[61,2979,137],{"class":108},[61,2981,140],{"class":104},[61,2983,143],{"class":108},[61,2985,2986],{"class":63,"line":1684},[61,2987,95],{"emptyLinePlaceholder":94},[61,2989,2990,2993,2996],{"class":63,"line":1689},[61,2991,2992],{"class":108},"    Printer ",[61,2994,2995],{"class":104},"printer",[61,2997,2998],{"class":108},"(io);\n",[61,3000,3001],{"class":63,"line":1716},[61,3002,95],{"emptyLinePlaceholder":94},[61,3004,3005,3007,3009,3011,3013,3015,3017],{"class":63,"line":1721},[61,3006,206],{"class":104},[61,3008,209],{"class":108},[61,3010,212],{"class":67},[61,3012,872],{"class":71},[61,3014,218],{"class":67},[61,3016,221],{"class":104},[61,3018,224],{"class":108},[61,3020,3021],{"class":63,"line":1730},[61,3022,95],{"emptyLinePlaceholder":94},[61,3024,3025,3027,3029],{"class":63,"line":2385},[61,3026,889],{"class":108},[61,3028,892],{"class":104},[61,3030,247],{"class":108},[61,3032,3033],{"class":63,"line":2394},[61,3034,95],{"emptyLinePlaceholder":94},[61,3036,3037,3039,3041,3043,3046,3048,3050],{"class":63,"line":2402},[61,3038,206],{"class":104},[61,3040,209],{"class":108},[61,3042,212],{"class":67},[61,3044,3045],{"class":71}," \"main：io.run() 返回\"",[61,3047,218],{"class":67},[61,3049,221],{"class":104},[61,3051,224],{"class":108},[61,3053,3054],{"class":63,"line":2407},[61,3055,95],{"emptyLinePlaceholder":94},[61,3057,3058,3060,3062],{"class":63,"line":2416},[61,3059,281],{"class":67},[61,3061,284],{"class":191},[61,3063,287],{"class":108},[61,3065,3066],{"class":63,"line":2421},[61,3067,293],{"class":108},[13,3069,3070,300],{},[297,3071,299],{},[40,3073,304],{"id":3074},"compile-and-run-4",[52,3076,3078],{"className":307,"code":3077,"language":309,"meta":57,"style":57},"g++ demo5_class_timer.cpp -o demo5_class_timer -std=c++17 -lboost_system -pthread\n.\u002Fdemo5_class_timer\n",[17,3079,3080,3098],{"__ignoreMap":57},[61,3081,3082,3084,3087,3089,3092,3094,3096],{"class":63,"line":64},[61,3083,316],{"class":104},[61,3085,3086],{"class":71}," demo5_class_timer.cpp",[61,3088,322],{"class":191},[61,3090,3091],{"class":71}," demo5_class_timer",[61,3093,328],{"class":191},[61,3095,331],{"class":191},[61,3097,334],{"class":191},[61,3099,3100],{"class":63,"line":75},[61,3101,3102],{"class":104},".\u002Fdemo5_class_timer\n",[40,3104,343],{"id":3105},"execution-output-and-chronological-order-4",[13,3107,977],{},[52,3109,3112],{"className":3110,"code":3111,"language":349,"meta":57},[347],"Printer 构造：注册 2 秒定时器\nmain：准备调用 io.run()\n",[17,3113,3111],{"__ignoreMap":57},[13,3115,3116],{},"Output in about 2 seconds:",[52,3118,3121],{"className":3119,"code":3120,"language":349,"meta":57},[347],"Printer::on_timer：2 秒到了\nmain：io.run() 返回\n",[17,3122,3120],{"__ignoreMap":57},[13,3124,363],{},[52,3126,3129],{"className":3127,"code":3128,"language":349,"meta":57},[347],"Printer 构造：注册 2 秒定时器\nmain：准备调用 io.run()\nPrinter::on_timer：2 秒到了\nmain：io.run() 返回\n",[17,3130,3128],{"__ignoreMap":57},[40,3132,3134],{"id":3133},"constructor-initializer-list-explanation","Constructor Initializer List Explanation",[13,3136,3137],{},"I see you've indicated \"这段：\" but didn't include the Chinese text to translate. Please provide the Chinese Markdown fragment you'd like me to translate into natural American English.",[52,3139,3141],{"className":54,"code":3140,"language":56,"meta":57,"style":57},"explicit Printer(boost::asio::io_context& io)\n    : timer_(io, std::chrono::seconds(2))\n{\n}\n",[17,3142,3143,3166,3191,3195],{"__ignoreMap":57},[61,3144,3145,3148,3150,3152,3154,3156,3158,3161,3163],{"class":63,"line":64},[61,3146,3147],{"class":67},"explicit",[61,3149,2684],{"class":104},[61,3151,188],{"class":108},[61,3153,2689],{"class":104},[61,3155,137],{"class":108},[61,3157,140],{"class":104},[61,3159,3160],{"class":108},"::io_context",[61,3162,609],{"class":67},[61,3164,3165],{"class":108}," io)\n",[61,3167,3168,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189],{"class":63,"line":75},[61,3169,3170],{"class":108},"    : ",[61,3172,2712],{"class":104},[61,3174,172],{"class":108},[61,3176,175],{"class":104},[61,3178,137],{"class":108},[61,3180,180],{"class":104},[61,3182,137],{"class":108},[61,3184,185],{"class":104},[61,3186,188],{"class":108},[61,3188,192],{"class":191},[61,3190,1876],{"class":108},[61,3192,3193],{"class":63,"line":83},[61,3194,115],{"class":108},[61,3196,3197],{"class":63,"line":91},[61,3198,293],{"class":108},[13,3200,3201],{},"What follows the colon is called the \"constructor initializer list.\"",[13,3203,3204,3205,3207],{},"Its role is: directly construct the member variable ",[17,3206,2712],{}," before entering the constructor's braces.",[13,3209,3210,3211,3214,3215,3217],{},"Why must it be written this way? Because ",[17,3212,3213],{},"boost::asio::steady_timer"," does not have a simple way to default-construct it first and then assign a value. It needs to know which ",[17,3216,448],{}," it belongs to at construction time.",[40,3219,3221],{"id":3220},"member-function-binding-description","Member function binding description",[13,3223,1839],{},[52,3225,3227],{"className":54,"code":3226,"language":56,"meta":57,"style":57},"timer_.async_wait(std::bind(&Printer::on_timer,\n                            this,\n                            std::placeholders::_1));\n",[17,3228,3229,3252,3259],{"__ignoreMap":57},[61,3230,3231,3234,3236,3238,3240,3242,3244,3246,3248,3250],{"class":63,"line":64},[61,3232,3233],{"class":108},"timer_.",[61,3235,815],{"class":104},[61,3237,188],{"class":108},[61,3239,175],{"class":104},[61,3241,137],{"class":108},[61,3243,824],{"class":104},[61,3245,188],{"class":108},[61,3247,609],{"class":67},[61,3249,2782],{"class":104},[61,3251,2785],{"class":108},[61,3253,3254,3257],{"class":63,"line":75},[61,3255,3256],{"class":191},"                            this",[61,3258,1989],{"class":108},[61,3260,3261,3264,3266,3268],{"class":63,"line":83},[61,3262,3263],{"class":104},"                            std",[61,3265,137],{"class":108},[61,3267,834],{"class":104},[61,3269,837],{"class":108},[13,3271,3272],{},"The meaning is:",[52,3274,3277],{"className":3275,"code":3276,"language":349,"meta":57},[347],"定时器到期后，调用 this->on_timer(ec)。\n",[17,3278,3276],{"__ignoreMap":57},[13,3280,3281,3282,3285],{},"Why write ",[17,3283,3284],{},"&Printer::on_timer","?",[13,3287,3288,3289,3291],{},"Because ",[17,3290,1106],{}," is a member function, not a regular global function. Member functions must depend on an object to be called.",[13,3293,3294,3295,3285],{},"Why pass ",[17,3296,3297],{},"this",[13,3299,3288,3300,3302,3303,3305],{},[17,3301,3297],{}," represents the current ",[17,3304,2782],{}," object.",[40,3307,3309],{"id":3308},"common-pitfalls","Common Pitfalls",[13,3311,3312],{},"Do not write as:",[52,3314,3316],{"className":54,"code":3315,"language":56,"meta":57,"style":57},"std::bind(on_timer, std::placeholders::_1)\n",[17,3317,3318],{"__ignoreMap":57},[61,3319,3320,3322,3324,3326,3328,3330,3332,3334],{"class":63,"line":64},[61,3321,175],{"class":104},[61,3323,137],{"class":108},[61,3325,824],{"class":104},[61,3327,827],{"class":108},[61,3329,175],{"class":104},[61,3331,137],{"class":108},[61,3333,834],{"class":104},[61,3335,3336],{"class":108},"::_1)\n",[13,3338,3288,3339,3341],{},[17,3340,1106],{}," is a member function, not a regular function.",[13,3343,3344,3345,3347],{},"Also do not miss ",[17,3346,3297],{},":",[52,3349,3351],{"className":54,"code":3350,"language":56,"meta":57,"style":57},"std::bind(&Printer::on_timer, std::placeholders::_1)\n",[17,3352,3353],{"__ignoreMap":57},[61,3354,3355,3357,3359,3361,3363,3365,3367,3370,3372,3374,3376],{"class":63,"line":64},[61,3356,175],{"class":104},[61,3358,137],{"class":108},[61,3360,824],{"class":104},[61,3362,188],{"class":108},[61,3364,609],{"class":67},[61,3366,2782],{"class":104},[61,3368,3369],{"class":108},"::on_timer, ",[61,3371,175],{"class":104},[61,3373,137],{"class":108},[61,3375,834],{"class":104},[61,3377,3336],{"class":108},[13,3379,3380,3381,3384],{},"This way, I don't know which object's ",[17,3382,3383],{},"on_timer()"," to call.",[29,3386],{},[32,3388,3390],{"id":3389},"example-6-writing-two-timers-in-a-class","Example 6: Writing Two Timers in a Class",[40,3392,43],{"id":3393},"program-objective-5",[13,3395,3396],{},"Maintain two timers simultaneously in a class:",[511,3398,3399,3405,3411],{},[514,3400,3401,3404],{},[17,3402,3403],{},"timer1_"," execute after 1 second;",[514,3406,3407,3410],{},[17,3408,3409],{},"timer2_"," execute after 3 seconds;",[514,3412,3413],{},"Use this example to clearly see that \"two asynchronous tasks are not equivalent to two threads.\"",[40,3415,50],{"id":3416},"full-code-5",[52,3418,3420],{"className":54,"code":3419,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n\nclass TwoTimers\n{\npublic:\n    explicit TwoTimers(boost::asio::io_context& io)\n        : timer1_(io, std::chrono::seconds(1)),\n          timer2_(io, std::chrono::seconds(3))\n    {\n        std::cout \u003C\u003C \"TwoTimers 构造：注册 timer1 和 timer2\" \u003C\u003C std::endl;\n\n        \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n        timer1_.async_wait(std::bind(&TwoTimers::on_timer1,\n                                     this,\n                                     std::placeholders::_1));\n\n        timer2_.async_wait(std::bind(&TwoTimers::on_timer2,\n                                     this,\n                                     std::placeholders::_1));\n    }\n\nprivate:\n    void on_timer1(const boost::system::error_code& ec)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"timer1 取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"timer1：1 秒到了\" \u003C\u003C std::endl;\n    }\n\n    void on_timer2(const boost::system::error_code& ec)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"timer2 取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"timer2：3 秒到了\" \u003C\u003C std::endl;\n    }\n\nprivate:\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer1_;\n    boost::asio::steady_timer timer2_;\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    TwoTimers app(io);\n\n    std::cout \u003C\u003C \"main：调用 io.run()\" \u003C\u003C std::endl;\n\n    io.run();\n\n    std::cout \u003C\u003C \"main：两个定时器都执行完，io.run() 返回\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,3421,3422,3428,3434,3440,3446,3452,3456,3463,3467,3471,3496,3521,3544,3548,3565,3569,3573,3598,3605,3616,3620,3644,3650,3660,3664,3668,3672,3699,3703,3709,3713,3738,3744,3748,3752,3769,3773,3777,3804,3808,3814,3818,3843,3849,3853,3857,3874,3878,3882,3886,3890,3901,3912,3916,3920,3928,3932,3937,3942,3953,3964,3969,3986,3991,4000,4005,4023,4028,4037],{"__ignoreMap":57},[61,3423,3424,3426],{"class":63,"line":64},[61,3425,68],{"class":67},[61,3427,72],{"class":71},[61,3429,3430,3432],{"class":63,"line":75},[61,3431,68],{"class":67},[61,3433,558],{"class":71},[61,3435,3436,3438],{"class":63,"line":83},[61,3437,68],{"class":67},[61,3439,80],{"class":71},[61,3441,3442,3444],{"class":63,"line":91},[61,3443,68],{"class":67},[61,3445,571],{"class":71},[61,3447,3448,3450],{"class":63,"line":98},[61,3449,68],{"class":67},[61,3451,88],{"class":71},[61,3453,3454],{"class":63,"line":112},[61,3455,95],{"emptyLinePlaceholder":94},[61,3457,3458,3460],{"class":63,"line":118},[61,3459,2664],{"class":67},[61,3461,3462],{"class":104}," TwoTimers\n",[61,3464,3465],{"class":63,"line":125},[61,3466,115],{"class":108},[61,3468,3469],{"class":63,"line":131},[61,3470,2676],{"class":67},[61,3472,3473,3475,3478,3480,3482,3484,3486,3488,3490,3492,3494],{"class":63,"line":146},[61,3474,2681],{"class":67},[61,3476,3477],{"class":104}," TwoTimers",[61,3479,188],{"class":108},[61,3481,2689],{"class":104},[61,3483,137],{"class":108},[61,3485,140],{"class":104},[61,3487,137],{"class":108},[61,3489,448],{"class":104},[61,3491,609],{"class":67},[61,3493,2702],{"class":612},[61,3495,473],{"class":108},[61,3497,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518],{"class":63,"line":151},[61,3499,2709],{"class":108},[61,3501,3403],{"class":104},[61,3503,172],{"class":108},[61,3505,175],{"class":104},[61,3507,137],{"class":108},[61,3509,180],{"class":104},[61,3511,137],{"class":108},[61,3513,185],{"class":104},[61,3515,188],{"class":108},[61,3517,1465],{"class":191},[61,3519,3520],{"class":108},")),\n",[61,3522,3523,3526,3528,3530,3532,3534,3536,3538,3540,3542],{"class":63,"line":157},[61,3524,3525],{"class":104},"          timer2_",[61,3527,172],{"class":108},[61,3529,175],{"class":104},[61,3531,137],{"class":108},[61,3533,180],{"class":104},[61,3535,137],{"class":108},[61,3537,185],{"class":104},[61,3539,188],{"class":108},[61,3541,1496],{"class":191},[61,3543,1876],{"class":108},[61,3545,3546],{"class":63,"line":198},[61,3547,632],{"class":108},[61,3549,3550,3552,3554,3556,3559,3561,3563],{"class":63,"line":203},[61,3551,637],{"class":104},[61,3553,209],{"class":108},[61,3555,212],{"class":67},[61,3557,3558],{"class":71}," \"TwoTimers 构造：注册 timer1 和 timer2\"",[61,3560,218],{"class":67},[61,3562,221],{"class":104},[61,3564,224],{"class":108},[61,3566,3567],{"class":63,"line":227},[61,3568,95],{"emptyLinePlaceholder":94},[61,3570,3571],{"class":63,"line":232},[61,3572,2760],{"class":121},[61,3574,3575,3578,3580,3582,3584,3586,3588,3590,3592,3595],{"class":63,"line":238},[61,3576,3577],{"class":108},"        timer1_.",[61,3579,815],{"class":104},[61,3581,188],{"class":108},[61,3583,175],{"class":104},[61,3585,137],{"class":108},[61,3587,824],{"class":104},[61,3589,188],{"class":108},[61,3591,609],{"class":67},[61,3593,3594],{"class":104},"TwoTimers",[61,3596,3597],{"class":108},"::on_timer1,\n",[61,3599,3600,3603],{"class":63,"line":250},[61,3601,3602],{"class":191},"                                     this",[61,3604,1989],{"class":108},[61,3606,3607,3610,3612,3614],{"class":63,"line":255},[61,3608,3609],{"class":104},"                                     std",[61,3611,137],{"class":108},[61,3613,834],{"class":104},[61,3615,837],{"class":108},[61,3617,3618],{"class":63,"line":273},[61,3619,95],{"emptyLinePlaceholder":94},[61,3621,3622,3625,3627,3629,3631,3633,3635,3637,3639,3641],{"class":63,"line":278},[61,3623,3624],{"class":108},"        timer2_.",[61,3626,815],{"class":104},[61,3628,188],{"class":108},[61,3630,175],{"class":104},[61,3632,137],{"class":108},[61,3634,824],{"class":104},[61,3636,188],{"class":108},[61,3638,609],{"class":67},[61,3640,3594],{"class":104},[61,3642,3643],{"class":108},"::on_timer2,\n",[61,3645,3646,3648],{"class":63,"line":290},[61,3647,3602],{"class":191},[61,3649,1989],{"class":108},[61,3651,3652,3654,3656,3658],{"class":63,"line":735},[61,3653,3609],{"class":104},[61,3655,137],{"class":108},[61,3657,834],{"class":104},[61,3659,837],{"class":108},[61,3661,3662],{"class":63,"line":740},[61,3663,673],{"class":108},[61,3665,3666],{"class":63,"line":745},[61,3667,95],{"emptyLinePlaceholder":94},[61,3669,3670],{"class":63,"line":776},[61,3671,2815],{"class":67},[61,3673,3674,3676,3679,3681,3683,3685,3687,3689,3691,3693,3695,3697],{"class":63,"line":781},[61,3675,2820],{"class":67},[61,3677,3678],{"class":104}," on_timer1",[61,3680,188],{"class":108},[61,3682,593],{"class":67},[61,3684,596],{"class":104},[61,3686,137],{"class":108},[61,3688,601],{"class":104},[61,3690,137],{"class":108},[61,3692,606],{"class":104},[61,3694,609],{"class":67},[61,3696,613],{"class":612},[61,3698,473],{"class":108},[61,3700,3701],{"class":63,"line":799},[61,3702,632],{"class":108},[61,3704,3705,3707],{"class":63,"line":804},[61,3706,2851],{"class":67},[61,3708,627],{"class":108},[61,3710,3711],{"class":63,"line":810},[61,3712,2858],{"class":108},[61,3714,3715,3717,3719,3721,3724,3726,3728,3730,3732,3734,3736],{"class":63,"line":840},[61,3716,2863],{"class":104},[61,3718,209],{"class":108},[61,3720,212],{"class":67},[61,3722,3723],{"class":71}," \"timer1 取消：\"",[61,3725,218],{"class":67},[61,3727,649],{"class":108},[61,3729,652],{"class":104},[61,3731,655],{"class":108},[61,3733,212],{"class":67},[61,3735,221],{"class":104},[61,3737,224],{"class":108},[61,3739,3740,3742],{"class":63,"line":845},[61,3741,2889],{"class":67},[61,3743,287],{"class":108},[61,3745,3746],{"class":63,"line":863},[61,3747,2896],{"class":108},[61,3749,3750],{"class":63,"line":881},[61,3751,95],{"emptyLinePlaceholder":94},[61,3753,3754,3756,3758,3760,3763,3765,3767],{"class":63,"line":886},[61,3755,637],{"class":104},[61,3757,209],{"class":108},[61,3759,212],{"class":67},[61,3761,3762],{"class":71}," \"timer1：1 秒到了\"",[61,3764,218],{"class":67},[61,3766,221],{"class":104},[61,3768,224],{"class":108},[61,3770,3771],{"class":63,"line":897},[61,3772,673],{"class":108},[61,3774,3775],{"class":63,"line":902},[61,3776,95],{"emptyLinePlaceholder":94},[61,3778,3779,3781,3784,3786,3788,3790,3792,3794,3796,3798,3800,3802],{"class":63,"line":920},[61,3780,2820],{"class":67},[61,3782,3783],{"class":104}," on_timer2",[61,3785,188],{"class":108},[61,3787,593],{"class":67},[61,3789,596],{"class":104},[61,3791,137],{"class":108},[61,3793,601],{"class":104},[61,3795,137],{"class":108},[61,3797,606],{"class":104},[61,3799,609],{"class":67},[61,3801,613],{"class":612},[61,3803,473],{"class":108},[61,3805,3806],{"class":63,"line":925},[61,3807,632],{"class":108},[61,3809,3810,3812],{"class":63,"line":934},[61,3811,2851],{"class":67},[61,3813,627],{"class":108},[61,3815,3816],{"class":63,"line":1656},[61,3817,2858],{"class":108},[61,3819,3820,3822,3824,3826,3829,3831,3833,3835,3837,3839,3841],{"class":63,"line":1661},[61,3821,2863],{"class":104},[61,3823,209],{"class":108},[61,3825,212],{"class":67},[61,3827,3828],{"class":71}," \"timer2 取消：\"",[61,3830,218],{"class":67},[61,3832,649],{"class":108},[61,3834,652],{"class":104},[61,3836,655],{"class":108},[61,3838,212],{"class":67},[61,3840,221],{"class":104},[61,3842,224],{"class":108},[61,3844,3845,3847],{"class":63,"line":1684},[61,3846,2889],{"class":67},[61,3848,287],{"class":108},[61,3850,3851],{"class":63,"line":1689},[61,3852,2896],{"class":108},[61,3854,3855],{"class":63,"line":1716},[61,3856,95],{"emptyLinePlaceholder":94},[61,3858,3859,3861,3863,3865,3868,3870,3872],{"class":63,"line":1721},[61,3860,637],{"class":104},[61,3862,209],{"class":108},[61,3864,212],{"class":67},[61,3866,3867],{"class":71}," \"timer2：3 秒到了\"",[61,3869,218],{"class":67},[61,3871,221],{"class":104},[61,3873,224],{"class":108},[61,3875,3876],{"class":63,"line":1730},[61,3877,673],{"class":108},[61,3879,3880],{"class":63,"line":2385},[61,3881,95],{"emptyLinePlaceholder":94},[61,3883,3884],{"class":63,"line":2394},[61,3885,2815],{"class":67},[61,3887,3888],{"class":63,"line":2402},[61,3889,154],{"class":121},[61,3891,3892,3894,3896,3898],{"class":63,"line":2407},[61,3893,134],{"class":104},[61,3895,137],{"class":108},[61,3897,140],{"class":104},[61,3899,3900],{"class":108},"::steady_timer timer1_;\n",[61,3902,3903,3905,3907,3909],{"class":63,"line":2416},[61,3904,134],{"class":104},[61,3906,137],{"class":108},[61,3908,140],{"class":104},[61,3910,3911],{"class":108},"::steady_timer timer2_;\n",[61,3913,3914],{"class":63,"line":2421},[61,3915,2949],{"class":108},[61,3917,3918],{"class":63,"line":2438},[61,3919,95],{"emptyLinePlaceholder":94},[61,3921,3922,3924,3926],{"class":63,"line":2443},[61,3923,101],{"class":67},[61,3925,105],{"class":104},[61,3927,109],{"class":108},[61,3929,3930],{"class":63,"line":2452},[61,3931,115],{"class":108},[61,3933,3935],{"class":63,"line":3934},57,[61,3936,122],{"class":121},[61,3938,3940],{"class":63,"line":3939},58,[61,3941,128],{"class":121},[61,3943,3945,3947,3949,3951],{"class":63,"line":3944},59,[61,3946,134],{"class":104},[61,3948,137],{"class":108},[61,3950,140],{"class":104},[61,3952,143],{"class":108},[61,3954,3956,3959,3962],{"class":63,"line":3955},60,[61,3957,3958],{"class":108},"    TwoTimers ",[61,3960,3961],{"class":104},"app",[61,3963,2998],{"class":108},[61,3965,3967],{"class":63,"line":3966},61,[61,3968,95],{"emptyLinePlaceholder":94},[61,3970,3972,3974,3976,3978,3980,3982,3984],{"class":63,"line":3971},62,[61,3973,206],{"class":104},[61,3975,209],{"class":108},[61,3977,212],{"class":67},[61,3979,1647],{"class":71},[61,3981,218],{"class":67},[61,3983,221],{"class":104},[61,3985,224],{"class":108},[61,3987,3989],{"class":63,"line":3988},63,[61,3990,95],{"emptyLinePlaceholder":94},[61,3992,3994,3996,3998],{"class":63,"line":3993},64,[61,3995,889],{"class":108},[61,3997,892],{"class":104},[61,3999,247],{"class":108},[61,4001,4003],{"class":63,"line":4002},65,[61,4004,95],{"emptyLinePlaceholder":94},[61,4006,4008,4010,4012,4014,4017,4019,4021],{"class":63,"line":4007},66,[61,4009,206],{"class":104},[61,4011,209],{"class":108},[61,4013,212],{"class":67},[61,4015,4016],{"class":71}," \"main：两个定时器都执行完，io.run() 返回\"",[61,4018,218],{"class":67},[61,4020,221],{"class":104},[61,4022,224],{"class":108},[61,4024,4026],{"class":63,"line":4025},67,[61,4027,95],{"emptyLinePlaceholder":94},[61,4029,4031,4033,4035],{"class":63,"line":4030},68,[61,4032,281],{"class":67},[61,4034,284],{"class":191},[61,4036,287],{"class":108},[61,4038,4040],{"class":63,"line":4039},69,[61,4041,293],{"class":108},[13,4043,4044,300],{},[297,4045,299],{},[40,4047,304],{"id":4048},"compile-and-run-5",[52,4050,4052],{"className":307,"code":4051,"language":309,"meta":57,"style":57},"g++ demo6_class_two_timers.cpp -o demo6_class_two_timers -std=c++17 -lboost_system -pthread\n.\u002Fdemo6_class_two_timers\n",[17,4053,4054,4072],{"__ignoreMap":57},[61,4055,4056,4058,4061,4063,4066,4068,4070],{"class":63,"line":64},[61,4057,316],{"class":104},[61,4059,4060],{"class":71}," demo6_class_two_timers.cpp",[61,4062,322],{"class":191},[61,4064,4065],{"class":71}," demo6_class_two_timers",[61,4067,328],{"class":191},[61,4069,331],{"class":191},[61,4071,334],{"class":191},[61,4073,4074],{"class":63,"line":75},[61,4075,4076],{"class":104},".\u002Fdemo6_class_two_timers\n",[40,4078,343],{"id":4079},"execution-output-and-chronological-order-5",[13,4081,977],{},[52,4083,4086],{"className":4084,"code":4085,"language":349,"meta":57},[347],"TwoTimers 构造：注册 timer1 和 timer2\nmain：调用 io.run()\n",[17,4087,4085],{"__ignoreMap":57},[13,4089,2503],{},[52,4091,4094],{"className":4092,"code":4093,"language":349,"meta":57},[347],"timer1：1 秒到了\n",[17,4095,4093],{"__ignoreMap":57},[13,4097,4098],{},"After about 3 seconds:",[52,4100,4103],{"className":4101,"code":4102,"language":349,"meta":57},[347],"timer2：3 秒到了\nmain：两个定时器都执行完，io.run() 返回\n",[17,4104,4102],{"__ignoreMap":57},[13,4106,363],{},[52,4108,4111],{"className":4109,"code":4110,"language":349,"meta":57},[347],"TwoTimers 构造：注册 timer1 和 timer2\nmain：调用 io.run()\ntimer1：1 秒到了\ntimer2：3 秒到了\nmain：两个定时器都执行完，io.run() 返回\n",[17,4112,4110],{"__ignoreMap":57},[40,4114,373],{"id":4115},"points-to-note-for-this-example-4",[13,4117,4118,1816,4120,4122],{},[17,4119,3403],{},[17,4121,3409],{}," are two asynchronous tasks, but this example still has only one thread.",[13,4124,4125],{},"Because only the main thread called：",[52,4127,4128],{"className":54,"code":989,"language":56,"meta":57,"style":57},[17,4129,4130],{"__ignoreMap":57},[61,4131,4132,4134,4136],{"class":63,"line":64},[61,4133,996],{"class":108},[61,4135,892],{"class":104},[61,4137,247],{"class":108},[13,4139,4140],{},"So both callbacks are executed in the main thread and will not run in parallel.",[29,4142],{},[32,4144,4146,4147,4149],{"id":4145},"example-7-two-threads-run-the-same-io_context-simultaneously","Example 7: Two threads run the same ",[17,4148,448],{}," simultaneously.",[40,4151,43],{"id":4152},"program-objective-6",[13,4154,4155,4156,4158],{},"This time, let both threads call ",[17,4157,527],{}," and observe that the callback may be executed by different threads.",[13,4160,4161],{},"This example is used to understand programs like the official Timer.5:",[52,4163,4166],{"className":4164,"code":4165,"language":349,"meta":57},[347],"多个线程 run 同一个 io_context\n回调函数可能分配给任意一个正在 run 的线程执行\n",[17,4167,4165],{"__ignoreMap":57},[40,4169,50],{"id":4170},"full-code-6",[52,4172,4174],{"className":54,"code":4173,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nvoid print_timer(const boost::system::error_code& ec, const std::string& name)\n{\n    if (ec)\n    {\n        std::cout \u003C\u003C name \u003C\u003C \" 取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return;\n    }\n\n    std::cout \u003C\u003C name \u003C\u003C \" 回调执行，线程 id = \"\n              \u003C\u003C std::this_thread::get_id() \u003C\u003C std::endl;\n}\n\nvoid run_io(boost::asio::io_context* io, const std::string& thread_name)\n{\n    std::cout \u003C\u003C thread_name \u003C\u003C \" 开始调用 io.run()，线程 id = \"\n              \u003C\u003C std::this_thread::get_id() \u003C\u003C std::endl;\n\n    io->run();\n\n    std::cout \u003C\u003C thread_name \u003C\u003C \" 的 io.run() 返回\" \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer1(io, std::chrono::seconds(1));\n    boost::asio::steady_timer timer2(io, std::chrono::seconds(1));\n\n    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n    timer1.async_wait(std::bind(print_timer,\n                                std::placeholders::_1,\n                                std::string(\"timer1\")));\n\n    timer2.async_wait(std::bind(print_timer,\n                                std::placeholders::_1,\n                                std::string(\"timer2\")));\n\n    std::thread t1(std::bind(run_io, &io, std::string(\"线程1\")));\n    std::thread t2(std::bind(run_io, &io, std::string(\"线程2\")));\n\n    t1.join();\n    t2.join();\n\n    std::cout \u003C\u003C \"main：两个线程都结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,4175,4176,4182,4188,4194,4200,4206,4212,4219,4223,4264,4268,4274,4278,4307,4313,4317,4321,4336,4361,4365,4369,4409,4413,4429,4451,4455,4464,4468,4489,4493,4497,4505,4509,4513,4517,4527,4531,4535,4565,4595,4599,4603,4620,4630,4644,4648,4664,4674,4688,4692,4731,4767,4771,4781,4790,4794,4811,4815,4823],{"__ignoreMap":57},[61,4177,4178,4180],{"class":63,"line":64},[61,4179,68],{"class":67},[61,4181,72],{"class":71},[61,4183,4184,4186],{"class":63,"line":75},[61,4185,68],{"class":67},[61,4187,558],{"class":71},[61,4189,4190,4192],{"class":63,"line":83},[61,4191,68],{"class":67},[61,4193,80],{"class":71},[61,4195,4196,4198],{"class":63,"line":91},[61,4197,68],{"class":67},[61,4199,571],{"class":71},[61,4201,4202,4204],{"class":63,"line":98},[61,4203,68],{"class":67},[61,4205,88],{"class":71},[61,4207,4208,4210],{"class":63,"line":112},[61,4209,68],{"class":67},[61,4211,1264],{"class":71},[61,4213,4214,4216],{"class":63,"line":118},[61,4215,68],{"class":67},[61,4217,4218],{"class":71}," \u003Cthread>\n",[61,4220,4221],{"class":63,"line":125},[61,4222,95],{"emptyLinePlaceholder":94},[61,4224,4225,4227,4230,4232,4234,4236,4238,4240,4242,4244,4246,4248,4250,4252,4254,4256,4258,4260,4262],{"class":63,"line":131},[61,4226,491],{"class":67},[61,4228,4229],{"class":104}," print_timer",[61,4231,188],{"class":108},[61,4233,593],{"class":67},[61,4235,596],{"class":104},[61,4237,137],{"class":108},[61,4239,601],{"class":104},[61,4241,137],{"class":108},[61,4243,606],{"class":104},[61,4245,609],{"class":67},[61,4247,613],{"class":612},[61,4249,1295],{"class":108},[61,4251,593],{"class":67},[61,4253,221],{"class":104},[61,4255,137],{"class":108},[61,4257,1304],{"class":104},[61,4259,609],{"class":67},[61,4261,1309],{"class":612},[61,4263,473],{"class":108},[61,4265,4266],{"class":63,"line":146},[61,4267,115],{"class":108},[61,4269,4270,4272],{"class":63,"line":151},[61,4271,624],{"class":67},[61,4273,627],{"class":108},[61,4275,4276],{"class":63,"line":157},[61,4277,632],{"class":108},[61,4279,4280,4282,4284,4286,4288,4290,4293,4295,4297,4299,4301,4303,4305],{"class":63,"line":198},[61,4281,637],{"class":104},[61,4283,209],{"class":108},[61,4285,212],{"class":67},[61,4287,1336],{"class":108},[61,4289,212],{"class":67},[61,4291,4292],{"class":71}," \" 取消：\"",[61,4294,218],{"class":67},[61,4296,649],{"class":108},[61,4298,652],{"class":104},[61,4300,655],{"class":108},[61,4302,212],{"class":67},[61,4304,221],{"class":104},[61,4306,224],{"class":108},[61,4308,4309,4311],{"class":63,"line":203},[61,4310,666],{"class":67},[61,4312,287],{"class":108},[61,4314,4315],{"class":63,"line":227},[61,4316,673],{"class":108},[61,4318,4319],{"class":63,"line":232},[61,4320,95],{"emptyLinePlaceholder":94},[61,4322,4323,4325,4327,4329,4331,4333],{"class":63,"line":238},[61,4324,206],{"class":104},[61,4326,209],{"class":108},[61,4328,212],{"class":67},[61,4330,1336],{"class":108},[61,4332,212],{"class":67},[61,4334,4335],{"class":71}," \" 回调执行，线程 id = \"\n",[61,4337,4338,4341,4343,4345,4348,4350,4353,4355,4357,4359],{"class":63,"line":250},[61,4339,4340],{"class":67},"              \u003C\u003C",[61,4342,221],{"class":104},[61,4344,137],{"class":108},[61,4346,4347],{"class":104},"this_thread",[61,4349,137],{"class":108},[61,4351,4352],{"class":104},"get_id",[61,4354,655],{"class":108},[61,4356,212],{"class":67},[61,4358,221],{"class":104},[61,4360,224],{"class":108},[61,4362,4363],{"class":63,"line":255},[61,4364,293],{"class":108},[61,4366,4367],{"class":63,"line":273},[61,4368,95],{"emptyLinePlaceholder":94},[61,4370,4371,4373,4376,4378,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4407],{"class":63,"line":278},[61,4372,491],{"class":67},[61,4374,4375],{"class":104}," run_io",[61,4377,188],{"class":108},[61,4379,2689],{"class":104},[61,4381,137],{"class":108},[61,4383,140],{"class":104},[61,4385,137],{"class":108},[61,4387,448],{"class":104},[61,4389,2006],{"class":67},[61,4391,2702],{"class":612},[61,4393,1295],{"class":108},[61,4395,593],{"class":67},[61,4397,221],{"class":104},[61,4399,137],{"class":108},[61,4401,1304],{"class":104},[61,4403,609],{"class":67},[61,4405,4406],{"class":612}," thread_name",[61,4408,473],{"class":108},[61,4410,4411],{"class":63,"line":290},[61,4412,115],{"class":108},[61,4414,4415,4417,4419,4421,4424,4426],{"class":63,"line":735},[61,4416,206],{"class":104},[61,4418,209],{"class":108},[61,4420,212],{"class":67},[61,4422,4423],{"class":108}," thread_name ",[61,4425,212],{"class":67},[61,4427,4428],{"class":71}," \" 开始调用 io.run()，线程 id = \"\n",[61,4430,4431,4433,4435,4437,4439,4441,4443,4445,4447,4449],{"class":63,"line":740},[61,4432,4340],{"class":67},[61,4434,221],{"class":104},[61,4436,137],{"class":108},[61,4438,4347],{"class":104},[61,4440,137],{"class":108},[61,4442,4352],{"class":104},[61,4444,655],{"class":108},[61,4446,212],{"class":67},[61,4448,221],{"class":104},[61,4450,224],{"class":108},[61,4452,4453],{"class":63,"line":745},[61,4454,95],{"emptyLinePlaceholder":94},[61,4456,4457,4460,4462],{"class":63,"line":776},[61,4458,4459],{"class":108},"    io->",[61,4461,892],{"class":104},[61,4463,247],{"class":108},[61,4465,4466],{"class":63,"line":781},[61,4467,95],{"emptyLinePlaceholder":94},[61,4469,4470,4472,4474,4476,4478,4480,4483,4485,4487],{"class":63,"line":799},[61,4471,206],{"class":104},[61,4473,209],{"class":108},[61,4475,212],{"class":67},[61,4477,4423],{"class":108},[61,4479,212],{"class":67},[61,4481,4482],{"class":71}," \" 的 io.run() 返回\"",[61,4484,218],{"class":67},[61,4486,221],{"class":104},[61,4488,224],{"class":108},[61,4490,4491],{"class":63,"line":804},[61,4492,293],{"class":108},[61,4494,4495],{"class":63,"line":810},[61,4496,95],{"emptyLinePlaceholder":94},[61,4498,4499,4501,4503],{"class":63,"line":840},[61,4500,101],{"class":67},[61,4502,105],{"class":104},[61,4504,109],{"class":108},[61,4506,4507],{"class":63,"line":845},[61,4508,115],{"class":108},[61,4510,4511],{"class":63,"line":863},[61,4512,122],{"class":121},[61,4514,4515],{"class":63,"line":881},[61,4516,128],{"class":121},[61,4518,4519,4521,4523,4525],{"class":63,"line":886},[61,4520,134],{"class":104},[61,4522,137],{"class":108},[61,4524,140],{"class":104},[61,4526,143],{"class":108},[61,4528,4529],{"class":63,"line":897},[61,4530,95],{"emptyLinePlaceholder":94},[61,4532,4533],{"class":63,"line":902},[61,4534,154],{"class":121},[61,4536,4537,4539,4541,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563],{"class":63,"line":920},[61,4538,134],{"class":104},[61,4540,137],{"class":108},[61,4542,140],{"class":104},[61,4544,166],{"class":108},[61,4546,1201],{"class":104},[61,4548,172],{"class":108},[61,4550,175],{"class":104},[61,4552,137],{"class":108},[61,4554,180],{"class":104},[61,4556,137],{"class":108},[61,4558,185],{"class":104},[61,4560,188],{"class":108},[61,4562,1465],{"class":191},[61,4564,195],{"class":108},[61,4566,4567,4569,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591,4593],{"class":63,"line":925},[61,4568,134],{"class":104},[61,4570,137],{"class":108},[61,4572,140],{"class":104},[61,4574,166],{"class":108},[61,4576,1207],{"class":104},[61,4578,172],{"class":108},[61,4580,175],{"class":104},[61,4582,137],{"class":108},[61,4584,180],{"class":104},[61,4586,137],{"class":108},[61,4588,185],{"class":104},[61,4590,188],{"class":108},[61,4592,1465],{"class":191},[61,4594,195],{"class":108},[61,4596,4597],{"class":63,"line":934},[61,4598,95],{"emptyLinePlaceholder":94},[61,4600,4601],{"class":63,"line":1656},[61,4602,807],{"class":121},[61,4604,4605,4607,4609,4611,4613,4615,4617],{"class":63,"line":1661},[61,4606,1528],{"class":108},[61,4608,815],{"class":104},[61,4610,188],{"class":108},[61,4612,175],{"class":104},[61,4614,137],{"class":108},[61,4616,824],{"class":104},[61,4618,4619],{"class":108},"(print_timer,\n",[61,4621,4622,4624,4626,4628],{"class":63,"line":1684},[61,4623,1546],{"class":104},[61,4625,137],{"class":108},[61,4627,834],{"class":104},[61,4629,1553],{"class":108},[61,4631,4632,4634,4636,4638,4640,4642],{"class":63,"line":1689},[61,4633,1546],{"class":104},[61,4635,137],{"class":108},[61,4637,1304],{"class":104},[61,4639,188],{"class":108},[61,4641,1566],{"class":71},[61,4643,1569],{"class":108},[61,4645,4646],{"class":63,"line":1716},[61,4647,95],{"emptyLinePlaceholder":94},[61,4649,4650,4652,4654,4656,4658,4660,4662],{"class":63,"line":1721},[61,4651,1595],{"class":108},[61,4653,815],{"class":104},[61,4655,188],{"class":108},[61,4657,175],{"class":104},[61,4659,137],{"class":108},[61,4661,824],{"class":104},[61,4663,4619],{"class":108},[61,4665,4666,4668,4670,4672],{"class":63,"line":1730},[61,4667,1546],{"class":104},[61,4669,137],{"class":108},[61,4671,834],{"class":104},[61,4673,1553],{"class":108},[61,4675,4676,4678,4680,4682,4684,4686],{"class":63,"line":2385},[61,4677,1546],{"class":104},[61,4679,137],{"class":108},[61,4681,1304],{"class":104},[61,4683,188],{"class":108},[61,4685,1630],{"class":71},[61,4687,1569],{"class":108},[61,4689,4690],{"class":63,"line":2394},[61,4691,95],{"emptyLinePlaceholder":94},[61,4693,4694,4696,4699,4702,4704,4706,4708,4710,4713,4715,4718,4720,4722,4724,4726,4729],{"class":63,"line":2402},[61,4695,206],{"class":104},[61,4697,4698],{"class":108},"::thread ",[61,4700,4701],{"class":104},"t1",[61,4703,188],{"class":108},[61,4705,175],{"class":104},[61,4707,137],{"class":108},[61,4709,824],{"class":104},[61,4711,4712],{"class":108},"(run_io, ",[61,4714,609],{"class":67},[61,4716,4717],{"class":108},"io, ",[61,4719,175],{"class":104},[61,4721,137],{"class":108},[61,4723,1304],{"class":104},[61,4725,188],{"class":108},[61,4727,4728],{"class":71},"\"线程1\"",[61,4730,1569],{"class":108},[61,4732,4733,4735,4737,4740,4742,4744,4746,4748,4750,4752,4754,4756,4758,4760,4762,4765],{"class":63,"line":2407},[61,4734,206],{"class":104},[61,4736,4698],{"class":108},[61,4738,4739],{"class":104},"t2",[61,4741,188],{"class":108},[61,4743,175],{"class":104},[61,4745,137],{"class":108},[61,4747,824],{"class":104},[61,4749,4712],{"class":108},[61,4751,609],{"class":67},[61,4753,4717],{"class":108},[61,4755,175],{"class":104},[61,4757,137],{"class":108},[61,4759,1304],{"class":104},[61,4761,188],{"class":108},[61,4763,4764],{"class":71},"\"线程2\"",[61,4766,1569],{"class":108},[61,4768,4769],{"class":63,"line":2416},[61,4770,95],{"emptyLinePlaceholder":94},[61,4772,4773,4776,4779],{"class":63,"line":2421},[61,4774,4775],{"class":108},"    t1.",[61,4777,4778],{"class":104},"join",[61,4780,247],{"class":108},[61,4782,4783,4786,4788],{"class":63,"line":2438},[61,4784,4785],{"class":108},"    t2.",[61,4787,4778],{"class":104},[61,4789,247],{"class":108},[61,4791,4792],{"class":63,"line":2443},[61,4793,95],{"emptyLinePlaceholder":94},[61,4795,4796,4798,4800,4802,4805,4807,4809],{"class":63,"line":2452},[61,4797,206],{"class":104},[61,4799,209],{"class":108},[61,4801,212],{"class":67},[61,4803,4804],{"class":71}," \"main：两个线程都结束\"",[61,4806,218],{"class":67},[61,4808,221],{"class":104},[61,4810,224],{"class":108},[61,4812,4813],{"class":63,"line":3934},[61,4814,95],{"emptyLinePlaceholder":94},[61,4816,4817,4819,4821],{"class":63,"line":3939},[61,4818,281],{"class":67},[61,4820,284],{"class":191},[61,4822,287],{"class":108},[61,4824,4825],{"class":63,"line":3944},[61,4826,293],{"class":108},[13,4828,4829,300],{},[297,4830,299],{},[40,4832,304],{"id":4833},"compile-and-run-6",[52,4835,4837],{"className":307,"code":4836,"language":309,"meta":57,"style":57},"g++ demo7_two_threads.cpp -o demo7_two_threads -std=c++17 -lboost_system -pthread\n.\u002Fdemo7_two_threads\n",[17,4838,4839,4857],{"__ignoreMap":57},[61,4840,4841,4843,4846,4848,4851,4853,4855],{"class":63,"line":64},[61,4842,316],{"class":104},[61,4844,4845],{"class":71}," demo7_two_threads.cpp",[61,4847,322],{"class":191},[61,4849,4850],{"class":71}," demo7_two_threads",[61,4852,328],{"class":191},[61,4854,331],{"class":191},[61,4856,334],{"class":191},[61,4858,4859],{"class":63,"line":75},[61,4860,4861],{"class":104},".\u002Fdemo7_two_threads\n",[40,4863,343],{"id":4864},"execution-output-and-chronological-order-6",[13,4866,4867],{},"After the program starts, two threads output almost immediately:",[52,4869,4872],{"className":4870,"code":4871,"language":349,"meta":57},[347],"线程1 开始调用 io.run()，线程 id = 140000000000001\n线程2 开始调用 io.run()，线程 id = 140000000000002\n",[17,4873,4871],{"__ignoreMap":57},[13,4875,4876],{},"After about 1 second, both timers expire, and the output might be similar:",[52,4878,4881],{"className":4879,"code":4880,"language":349,"meta":57},[347],"timer1 回调执行，线程 id = 140000000000001\ntimer2 回调执行，线程 id = 140000000000002\n线程1 的 io.run() 返回\n线程2 的 io.run() 返回\nmain：两个线程都结束\n",[17,4882,4880],{"__ignoreMap":57},[13,4884,4885],{},"It is also possible that both callbacks are executed by the same thread. Thread scheduling does not guarantee fixed behavior.",[40,4887,373],{"id":4888},"points-to-note-for-this-example-5",[13,4890,4891],{},"The focus of this example is:",[52,4893,4896],{"className":4894,"code":4895,"language":349,"meta":57},[347],"谁调用 io.run()，谁就有可能执行回调函数。\n",[17,4897,4895],{"__ignoreMap":57},[13,4899,4900,4901,4903,4904,4906],{},"It is not that ",[17,4902,1201],{}," is permanently assigned to thread 1, and ",[17,4905,1207],{}," is permanently assigned to thread 2.",[40,4908,4910,4913,4914],{"id":4909},"stdthread-in-stdbind",[17,4911,4912],{},"std::thread"," in ",[17,4915,26],{},[13,4917,1839],{},[52,4919,4921],{"className":54,"code":4920,"language":56,"meta":57,"style":57},"std::thread t1(std::bind(run_io, &io, std::string(\"线程1\")));\n",[17,4922,4923],{"__ignoreMap":57},[61,4924,4925,4927,4929,4932,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959],{"class":63,"line":64},[61,4926,175],{"class":104},[61,4928,137],{"class":108},[61,4930,4931],{"class":104},"thread",[61,4933,4934],{"class":104}," t1",[61,4936,188],{"class":108},[61,4938,175],{"class":104},[61,4940,137],{"class":108},[61,4942,824],{"class":104},[61,4944,4712],{"class":108},[61,4946,609],{"class":67},[61,4948,4717],{"class":108},[61,4950,175],{"class":104},[61,4952,137],{"class":108},[61,4954,1304],{"class":104},[61,4956,188],{"class":108},[61,4958,4728],{"class":71},[61,4960,1569],{"class":108},[13,4962,4963],{},"It means to create a thread and execute in the new thread:",[52,4965,4967],{"className":54,"code":4966,"language":56,"meta":57,"style":57},"run_io(&io, \"线程1\");\n",[17,4968,4969],{"__ignoreMap":57},[61,4970,4971,4974,4976,4978,4980,4982],{"class":63,"line":64},[61,4972,4973],{"class":104},"run_io",[61,4975,188],{"class":108},[61,4977,609],{"class":67},[61,4979,4717],{"class":108},[61,4981,4728],{"class":71},[61,4983,4984],{"class":108},");\n",[13,4986,4987],{},"There is also no lambda used here.",[29,4989],{},[32,4991,4993,4994,4997],{"id":4992},"example-8-using-strand-in-multithreading-to-avoid-callback-concurrency","Example 8: Using ",[17,4995,4996],{},"strand"," in Multithreading to Avoid Callback Concurrency",[40,4999,43],{"id":5000},"program-objective-7",[13,5002,5003,5004,5007,5008,5010],{},"If multiple threads simultaneously ",[17,5005,5006],{},"run()"," a ",[17,5009,448],{},", different callbacks may execute concurrently.\nIf these callbacks all modify the same member variable, a data race may occur.",[13,5012,5013,5015],{},[17,5014,4996],{},"'s role is:",[52,5017,5020],{"className":5018,"code":5019,"language":349,"meta":57},[347],"保证绑定到同一个 strand 上的 handler 不会并发执行。\n",[17,5021,5019],{"__ignoreMap":57},[40,5023,50],{"id":5024},"full-code-7",[52,5026,5028],{"className":54,"code":5027,"language":56,"meta":57,"style":57},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nclass StrandCounter\n{\npublic:\n    explicit StrandCounter(boost::asio::io_context& io)\n        : strand_(boost::asio::make_strand(io)),\n          timer1_(io, std::chrono::seconds(1)),\n          timer2_(io, std::chrono::seconds(1)),\n          count_(0)\n    {\n        \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n        timer1_.async_wait(\n            boost::asio::bind_executor(\n                strand_,\n                std::bind(&StrandCounter::on_timer,\n                          this,\n                          std::placeholders::_1,\n                          1)));\n\n        timer2_.async_wait(\n            boost::asio::bind_executor(\n                strand_,\n                std::bind(&StrandCounter::on_timer,\n                          this,\n                          std::placeholders::_1,\n                          2)));\n    }\n\nprivate:\n    void on_timer(const boost::system::error_code& ec, int id)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"timer\" \u003C\u003C id \u003C\u003C \" 取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        ++count_;\n\n        std::cout \u003C\u003C \"timer\" \u003C\u003C id \u003C\u003C \" 回调执行，count = \" \u003C\u003C count_\n                  \u003C\u003C \"，线程 id = \" \u003C\u003C std::this_thread::get_id() \u003C\u003C std::endl;\n    }\n\nprivate:\n    boost::asio::strand\u003Cboost::asio::io_context::executor_type> strand_;\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer1_;\n    boost::asio::steady_timer timer2_;\n    int count_;\n};\n\nvoid run_io(boost::asio::io_context* io, const std::string& name)\n{\n    std::cout \u003C\u003C name \u003C\u003C \" 开始 run，线程 id = \"\n              \u003C\u003C std::this_thread::get_id() \u003C\u003C std::endl;\n\n    io->run();\n\n    std::cout \u003C\u003C name \u003C\u003C \" run 返回\" \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    StrandCounter counter(io);\n\n    std::thread t1(std::bind(run_io, &io, std::string(\"线程1\")));\n    std::thread t2(std::bind(run_io, &io, std::string(\"线程2\")));\n\n    t1.join();\n    t2.join();\n\n    std::cout \u003C\u003C \"main：结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,5029,5030,5036,5042,5048,5054,5060,5066,5070,5077,5081,5085,5110,5133,5156,5178,5190,5194,5198,5207,5223,5228,5246,5253,5264,5271,5275,5283,5297,5301,5317,5323,5333,5340,5344,5348,5352,5385,5389,5395,5399,5433,5439,5443,5447,5455,5459,5483,5511,5515,5519,5523,5555,5559,5569,5579,5586,5590,5594,5632,5636,5651,5673,5677,5685,5689,5710,5714,5718,5726,5730,5735,5740,5751,5762,5767,5802,5837,5842,5851,5860,5865,5883,5888,5897],{"__ignoreMap":57},[61,5031,5032,5034],{"class":63,"line":64},[61,5033,68],{"class":67},[61,5035,72],{"class":71},[61,5037,5038,5040],{"class":63,"line":75},[61,5039,68],{"class":67},[61,5041,558],{"class":71},[61,5043,5044,5046],{"class":63,"line":83},[61,5045,68],{"class":67},[61,5047,80],{"class":71},[61,5049,5050,5052],{"class":63,"line":91},[61,5051,68],{"class":67},[61,5053,571],{"class":71},[61,5055,5056,5058],{"class":63,"line":98},[61,5057,68],{"class":67},[61,5059,88],{"class":71},[61,5061,5062,5064],{"class":63,"line":112},[61,5063,68],{"class":67},[61,5065,4218],{"class":71},[61,5067,5068],{"class":63,"line":118},[61,5069,95],{"emptyLinePlaceholder":94},[61,5071,5072,5074],{"class":63,"line":125},[61,5073,2664],{"class":67},[61,5075,5076],{"class":104}," StrandCounter\n",[61,5078,5079],{"class":63,"line":131},[61,5080,115],{"class":108},[61,5082,5083],{"class":63,"line":146},[61,5084,2676],{"class":67},[61,5086,5087,5089,5092,5094,5096,5098,5100,5102,5104,5106,5108],{"class":63,"line":151},[61,5088,2681],{"class":67},[61,5090,5091],{"class":104}," StrandCounter",[61,5093,188],{"class":108},[61,5095,2689],{"class":104},[61,5097,137],{"class":108},[61,5099,140],{"class":104},[61,5101,137],{"class":108},[61,5103,448],{"class":104},[61,5105,609],{"class":67},[61,5107,2702],{"class":612},[61,5109,473],{"class":108},[61,5111,5112,5114,5117,5119,5121,5123,5125,5127,5130],{"class":63,"line":157},[61,5113,2709],{"class":108},[61,5115,5116],{"class":104},"strand_",[61,5118,188],{"class":108},[61,5120,2689],{"class":104},[61,5122,137],{"class":108},[61,5124,140],{"class":104},[61,5126,137],{"class":108},[61,5128,5129],{"class":104},"make_strand",[61,5131,5132],{"class":108},"(io)),\n",[61,5134,5135,5138,5140,5142,5144,5146,5148,5150,5152,5154],{"class":63,"line":198},[61,5136,5137],{"class":104},"          timer1_",[61,5139,172],{"class":108},[61,5141,175],{"class":104},[61,5143,137],{"class":108},[61,5145,180],{"class":104},[61,5147,137],{"class":108},[61,5149,185],{"class":104},[61,5151,188],{"class":108},[61,5153,1465],{"class":191},[61,5155,3520],{"class":108},[61,5157,5158,5160,5162,5164,5166,5168,5170,5172,5174,5176],{"class":63,"line":203},[61,5159,3525],{"class":104},[61,5161,172],{"class":108},[61,5163,175],{"class":104},[61,5165,137],{"class":108},[61,5167,180],{"class":104},[61,5169,137],{"class":108},[61,5171,185],{"class":104},[61,5173,188],{"class":108},[61,5175,1465],{"class":191},[61,5177,3520],{"class":108},[61,5179,5180,5183,5185,5188],{"class":63,"line":227},[61,5181,5182],{"class":104},"          count_",[61,5184,188],{"class":108},[61,5186,5187],{"class":191},"0",[61,5189,473],{"class":108},[61,5191,5192],{"class":63,"line":232},[61,5193,632],{"class":108},[61,5195,5196],{"class":63,"line":238},[61,5197,2760],{"class":121},[61,5199,5200,5202,5204],{"class":63,"line":250},[61,5201,3577],{"class":108},[61,5203,815],{"class":104},[61,5205,5206],{"class":108},"(\n",[61,5208,5209,5212,5214,5216,5218,5221],{"class":63,"line":255},[61,5210,5211],{"class":104},"            boost",[61,5213,137],{"class":108},[61,5215,140],{"class":104},[61,5217,137],{"class":108},[61,5219,5220],{"class":104},"bind_executor",[61,5222,5206],{"class":108},[61,5224,5225],{"class":63,"line":273},[61,5226,5227],{"class":108},"                strand_,\n",[61,5229,5230,5233,5235,5237,5239,5241,5244],{"class":63,"line":278},[61,5231,5232],{"class":104},"                std",[61,5234,137],{"class":108},[61,5236,824],{"class":104},[61,5238,188],{"class":108},[61,5240,609],{"class":67},[61,5242,5243],{"class":104},"StrandCounter",[61,5245,2785],{"class":108},[61,5247,5248,5251],{"class":63,"line":290},[61,5249,5250],{"class":191},"                          this",[61,5252,1989],{"class":108},[61,5254,5255,5258,5260,5262],{"class":63,"line":735},[61,5256,5257],{"class":104},"                          std",[61,5259,137],{"class":108},[61,5261,834],{"class":104},[61,5263,1553],{"class":108},[61,5265,5266,5269],{"class":63,"line":740},[61,5267,5268],{"class":191},"                          1",[61,5270,1569],{"class":108},[61,5272,5273],{"class":63,"line":745},[61,5274,95],{"emptyLinePlaceholder":94},[61,5276,5277,5279,5281],{"class":63,"line":776},[61,5278,3624],{"class":108},[61,5280,815],{"class":104},[61,5282,5206],{"class":108},[61,5284,5285,5287,5289,5291,5293,5295],{"class":63,"line":781},[61,5286,5211],{"class":104},[61,5288,137],{"class":108},[61,5290,140],{"class":104},[61,5292,137],{"class":108},[61,5294,5220],{"class":104},[61,5296,5206],{"class":108},[61,5298,5299],{"class":63,"line":799},[61,5300,5227],{"class":108},[61,5302,5303,5305,5307,5309,5311,5313,5315],{"class":63,"line":804},[61,5304,5232],{"class":104},[61,5306,137],{"class":108},[61,5308,824],{"class":104},[61,5310,188],{"class":108},[61,5312,609],{"class":67},[61,5314,5243],{"class":104},[61,5316,2785],{"class":108},[61,5318,5319,5321],{"class":63,"line":810},[61,5320,5250],{"class":191},[61,5322,1989],{"class":108},[61,5324,5325,5327,5329,5331],{"class":63,"line":840},[61,5326,5257],{"class":104},[61,5328,137],{"class":108},[61,5330,834],{"class":104},[61,5332,1553],{"class":108},[61,5334,5335,5338],{"class":63,"line":845},[61,5336,5337],{"class":191},"                          2",[61,5339,1569],{"class":108},[61,5341,5342],{"class":63,"line":863},[61,5343,673],{"class":108},[61,5345,5346],{"class":63,"line":881},[61,5347,95],{"emptyLinePlaceholder":94},[61,5349,5350],{"class":63,"line":886},[61,5351,2815],{"class":67},[61,5353,5354,5356,5358,5360,5362,5364,5366,5368,5370,5372,5374,5376,5378,5380,5383],{"class":63,"line":897},[61,5355,2820],{"class":67},[61,5357,588],{"class":104},[61,5359,188],{"class":108},[61,5361,593],{"class":67},[61,5363,596],{"class":104},[61,5365,137],{"class":108},[61,5367,601],{"class":104},[61,5369,137],{"class":108},[61,5371,606],{"class":104},[61,5373,609],{"class":67},[61,5375,613],{"class":612},[61,5377,1295],{"class":108},[61,5379,101],{"class":67},[61,5381,5382],{"class":612}," id",[61,5384,473],{"class":108},[61,5386,5387],{"class":63,"line":902},[61,5388,632],{"class":108},[61,5390,5391,5393],{"class":63,"line":920},[61,5392,2851],{"class":67},[61,5394,627],{"class":108},[61,5396,5397],{"class":63,"line":925},[61,5398,2858],{"class":108},[61,5400,5401,5403,5405,5407,5410,5412,5415,5417,5419,5421,5423,5425,5427,5429,5431],{"class":63,"line":934},[61,5402,2863],{"class":104},[61,5404,209],{"class":108},[61,5406,212],{"class":67},[61,5408,5409],{"class":71}," \"timer\"",[61,5411,218],{"class":67},[61,5413,5414],{"class":108}," id ",[61,5416,212],{"class":67},[61,5418,4292],{"class":71},[61,5420,218],{"class":67},[61,5422,649],{"class":108},[61,5424,652],{"class":104},[61,5426,655],{"class":108},[61,5428,212],{"class":67},[61,5430,221],{"class":104},[61,5432,224],{"class":108},[61,5434,5435,5437],{"class":63,"line":1656},[61,5436,2889],{"class":67},[61,5438,287],{"class":108},[61,5440,5441],{"class":63,"line":1661},[61,5442,2896],{"class":108},[61,5444,5445],{"class":63,"line":1684},[61,5446,95],{"emptyLinePlaceholder":94},[61,5448,5449,5452],{"class":63,"line":1689},[61,5450,5451],{"class":67},"        ++",[61,5453,5454],{"class":108},"count_;\n",[61,5456,5457],{"class":63,"line":1716},[61,5458,95],{"emptyLinePlaceholder":94},[61,5460,5461,5463,5465,5467,5469,5471,5473,5475,5478,5480],{"class":63,"line":1721},[61,5462,637],{"class":104},[61,5464,209],{"class":108},[61,5466,212],{"class":67},[61,5468,5409],{"class":71},[61,5470,218],{"class":67},[61,5472,5414],{"class":108},[61,5474,212],{"class":67},[61,5476,5477],{"class":71}," \" 回调执行，count = \"",[61,5479,218],{"class":67},[61,5481,5482],{"class":108}," count_\n",[61,5484,5485,5488,5491,5493,5495,5497,5499,5501,5503,5505,5507,5509],{"class":63,"line":1730},[61,5486,5487],{"class":67},"                  \u003C\u003C",[61,5489,5490],{"class":71}," \"，线程 id = \"",[61,5492,218],{"class":67},[61,5494,221],{"class":104},[61,5496,137],{"class":108},[61,5498,4347],{"class":104},[61,5500,137],{"class":108},[61,5502,4352],{"class":104},[61,5504,655],{"class":108},[61,5506,212],{"class":67},[61,5508,221],{"class":104},[61,5510,224],{"class":108},[61,5512,5513],{"class":63,"line":2385},[61,5514,673],{"class":108},[61,5516,5517],{"class":63,"line":2394},[61,5518,95],{"emptyLinePlaceholder":94},[61,5520,5521],{"class":63,"line":2402},[61,5522,2815],{"class":67},[61,5524,5525,5527,5529,5531,5534,5536,5538,5540,5542,5544,5546,5549,5552],{"class":63,"line":2407},[61,5526,134],{"class":104},[61,5528,137],{"class":108},[61,5530,140],{"class":104},[61,5532,5533],{"class":108},"::strand",[61,5535,2134],{"class":67},[61,5537,2689],{"class":104},[61,5539,137],{"class":108},[61,5541,140],{"class":104},[61,5543,137],{"class":108},[61,5545,448],{"class":104},[61,5547,5548],{"class":108},"::executor_type",[61,5550,5551],{"class":67},">",[61,5553,5554],{"class":108}," strand_;\n",[61,5556,5557],{"class":63,"line":2416},[61,5558,154],{"class":121},[61,5560,5561,5563,5565,5567],{"class":63,"line":2421},[61,5562,134],{"class":104},[61,5564,137],{"class":108},[61,5566,140],{"class":104},[61,5568,3900],{"class":108},[61,5570,5571,5573,5575,5577],{"class":63,"line":2438},[61,5572,134],{"class":104},[61,5574,137],{"class":108},[61,5576,140],{"class":104},[61,5578,3911],{"class":108},[61,5580,5581,5583],{"class":63,"line":2443},[61,5582,2318],{"class":67},[61,5584,5585],{"class":108}," count_;\n",[61,5587,5588],{"class":63,"line":2452},[61,5589,2949],{"class":108},[61,5591,5592],{"class":63,"line":3934},[61,5593,95],{"emptyLinePlaceholder":94},[61,5595,5596,5598,5600,5602,5604,5606,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626,5628,5630],{"class":63,"line":3939},[61,5597,491],{"class":67},[61,5599,4375],{"class":104},[61,5601,188],{"class":108},[61,5603,2689],{"class":104},[61,5605,137],{"class":108},[61,5607,140],{"class":104},[61,5609,137],{"class":108},[61,5611,448],{"class":104},[61,5613,2006],{"class":67},[61,5615,2702],{"class":612},[61,5617,1295],{"class":108},[61,5619,593],{"class":67},[61,5621,221],{"class":104},[61,5623,137],{"class":108},[61,5625,1304],{"class":104},[61,5627,609],{"class":67},[61,5629,1309],{"class":612},[61,5631,473],{"class":108},[61,5633,5634],{"class":63,"line":3944},[61,5635,115],{"class":108},[61,5637,5638,5640,5642,5644,5646,5648],{"class":63,"line":3955},[61,5639,206],{"class":104},[61,5641,209],{"class":108},[61,5643,212],{"class":67},[61,5645,1336],{"class":108},[61,5647,212],{"class":67},[61,5649,5650],{"class":71}," \" 开始 run，线程 id = \"\n",[61,5652,5653,5655,5657,5659,5661,5663,5665,5667,5669,5671],{"class":63,"line":3966},[61,5654,4340],{"class":67},[61,5656,221],{"class":104},[61,5658,137],{"class":108},[61,5660,4347],{"class":104},[61,5662,137],{"class":108},[61,5664,4352],{"class":104},[61,5666,655],{"class":108},[61,5668,212],{"class":67},[61,5670,221],{"class":104},[61,5672,224],{"class":108},[61,5674,5675],{"class":63,"line":3971},[61,5676,95],{"emptyLinePlaceholder":94},[61,5678,5679,5681,5683],{"class":63,"line":3988},[61,5680,4459],{"class":108},[61,5682,892],{"class":104},[61,5684,247],{"class":108},[61,5686,5687],{"class":63,"line":3993},[61,5688,95],{"emptyLinePlaceholder":94},[61,5690,5691,5693,5695,5697,5699,5701,5704,5706,5708],{"class":63,"line":4002},[61,5692,206],{"class":104},[61,5694,209],{"class":108},[61,5696,212],{"class":67},[61,5698,1336],{"class":108},[61,5700,212],{"class":67},[61,5702,5703],{"class":71}," \" run 返回\"",[61,5705,218],{"class":67},[61,5707,221],{"class":104},[61,5709,224],{"class":108},[61,5711,5712],{"class":63,"line":4007},[61,5713,293],{"class":108},[61,5715,5716],{"class":63,"line":4025},[61,5717,95],{"emptyLinePlaceholder":94},[61,5719,5720,5722,5724],{"class":63,"line":4030},[61,5721,101],{"class":67},[61,5723,105],{"class":104},[61,5725,109],{"class":108},[61,5727,5728],{"class":63,"line":4039},[61,5729,115],{"class":108},[61,5731,5733],{"class":63,"line":5732},70,[61,5734,122],{"class":121},[61,5736,5738],{"class":63,"line":5737},71,[61,5739,128],{"class":121},[61,5741,5743,5745,5747,5749],{"class":63,"line":5742},72,[61,5744,134],{"class":104},[61,5746,137],{"class":108},[61,5748,140],{"class":104},[61,5750,143],{"class":108},[61,5752,5754,5757,5760],{"class":63,"line":5753},73,[61,5755,5756],{"class":108},"    StrandCounter ",[61,5758,5759],{"class":104},"counter",[61,5761,2998],{"class":108},[61,5763,5765],{"class":63,"line":5764},74,[61,5766,95],{"emptyLinePlaceholder":94},[61,5768,5770,5772,5774,5776,5778,5780,5782,5784,5786,5788,5790,5792,5794,5796,5798,5800],{"class":63,"line":5769},75,[61,5771,206],{"class":104},[61,5773,4698],{"class":108},[61,5775,4701],{"class":104},[61,5777,188],{"class":108},[61,5779,175],{"class":104},[61,5781,137],{"class":108},[61,5783,824],{"class":104},[61,5785,4712],{"class":108},[61,5787,609],{"class":67},[61,5789,4717],{"class":108},[61,5791,175],{"class":104},[61,5793,137],{"class":108},[61,5795,1304],{"class":104},[61,5797,188],{"class":108},[61,5799,4728],{"class":71},[61,5801,1569],{"class":108},[61,5803,5805,5807,5809,5811,5813,5815,5817,5819,5821,5823,5825,5827,5829,5831,5833,5835],{"class":63,"line":5804},76,[61,5806,206],{"class":104},[61,5808,4698],{"class":108},[61,5810,4739],{"class":104},[61,5812,188],{"class":108},[61,5814,175],{"class":104},[61,5816,137],{"class":108},[61,5818,824],{"class":104},[61,5820,4712],{"class":108},[61,5822,609],{"class":67},[61,5824,4717],{"class":108},[61,5826,175],{"class":104},[61,5828,137],{"class":108},[61,5830,1304],{"class":104},[61,5832,188],{"class":108},[61,5834,4764],{"class":71},[61,5836,1569],{"class":108},[61,5838,5840],{"class":63,"line":5839},77,[61,5841,95],{"emptyLinePlaceholder":94},[61,5843,5845,5847,5849],{"class":63,"line":5844},78,[61,5846,4775],{"class":108},[61,5848,4778],{"class":104},[61,5850,247],{"class":108},[61,5852,5854,5856,5858],{"class":63,"line":5853},79,[61,5855,4785],{"class":108},[61,5857,4778],{"class":104},[61,5859,247],{"class":108},[61,5861,5863],{"class":63,"line":5862},80,[61,5864,95],{"emptyLinePlaceholder":94},[61,5866,5868,5870,5872,5874,5877,5879,5881],{"class":63,"line":5867},81,[61,5869,206],{"class":104},[61,5871,209],{"class":108},[61,5873,212],{"class":67},[61,5875,5876],{"class":71}," \"main：结束\"",[61,5878,218],{"class":67},[61,5880,221],{"class":104},[61,5882,224],{"class":108},[61,5884,5886],{"class":63,"line":5885},82,[61,5887,95],{"emptyLinePlaceholder":94},[61,5889,5891,5893,5895],{"class":63,"line":5890},83,[61,5892,281],{"class":67},[61,5894,284],{"class":191},[61,5896,287],{"class":108},[61,5898,5900],{"class":63,"line":5899},84,[61,5901,293],{"class":108},[13,5903,5904,300],{},[297,5905,299],{},[40,5907,304],{"id":5908},"compile-and-run-7",[52,5910,5912],{"className":307,"code":5911,"language":309,"meta":57,"style":57},"g++ demo8_strand.cpp -o demo8_strand -std=c++17 -lboost_system -pthread\n.\u002Fdemo8_strand\n",[17,5913,5914,5932],{"__ignoreMap":57},[61,5915,5916,5918,5921,5923,5926,5928,5930],{"class":63,"line":64},[61,5917,316],{"class":104},[61,5919,5920],{"class":71}," demo8_strand.cpp",[61,5922,322],{"class":191},[61,5924,5925],{"class":71}," demo8_strand",[61,5927,328],{"class":191},[61,5929,331],{"class":191},[61,5931,334],{"class":191},[61,5933,5934],{"class":63,"line":75},[61,5935,5936],{"class":104},".\u002Fdemo8_strand\n",[40,5938,343],{"id":5939},"execution-output-and-chronological-order-7",[13,5941,5942,5943,3347],{},"After the program starts, two threads start ",[17,5944,5006],{},[52,5946,5949],{"className":5947,"code":5948,"language":349,"meta":57},[347],"线程1 开始 run，线程 id = 140000000000001\n线程2 开始 run，线程 id = 140000000000002\n",[17,5950,5948],{"__ignoreMap":57},[13,5952,5953],{},"After about 1 second, two timers expire:",[52,5955,5958],{"className":5956,"code":5957,"language":349,"meta":57},[347],"timer1 回调执行，count = 1，线程 id = 140000000000001\ntimer2 回调执行，count = 2，线程 id = 140000000000002\n线程1 run 返回\n线程2 run 返回\nmain：结束\n",[17,5959,5957],{"__ignoreMap":57},[13,5961,5962,5963,5966],{},"The order of the thread id and timer is not fixed, but ",[17,5964,5965],{},"count"," will not have the concurrency issue of two callbacks modifying it simultaneously.",[40,5968,373],{"id":5969},"points-to-note-for-this-example-6",[13,5971,5972,5974,5975,5977],{},[17,5973,4996],{}," does not force all callbacks to be bound to the same thread.\n",[17,5976,4996],{}," ensures that these callbacks \"do not execute simultaneously.\"",[13,5979,5980],{},"In other words, it could be:",[52,5982,5985],{"className":5983,"code":5984,"language":349,"meta":57},[347],"timer1 在线程1执行\ntimer2 在线程2执行\n",[17,5986,5984],{"__ignoreMap":57},[13,5988,5989],{},"But it will not appear:",[52,5991,5994],{"className":5992,"code":5993,"language":349,"meta":57},[347],"timer1 和 timer2 同时进入 on_timer()\n",[17,5995,5993],{"__ignoreMap":57},[40,5997,5999,1060],{"id":5998},"bind_executor-description",[17,6000,5220],{},[13,6002,3137],{},[52,6004,6006],{"className":54,"code":6005,"language":56,"meta":57,"style":57},"boost::asio::bind_executor(strand_, handler)\n",[17,6007,6008],{"__ignoreMap":57},[61,6009,6010,6012,6014,6016,6018,6020],{"class":63,"line":64},[61,6011,2689],{"class":104},[61,6013,137],{"class":108},[61,6015,140],{"class":104},[61,6017,137],{"class":108},[61,6019,5220],{"class":104},[61,6021,6022],{"class":108},"(strand_, handler)\n",[13,6024,6025,6026,492],{},"Function: Bind the handler to the executor ",[17,6027,5116],{},[13,6029,6030],{},"以后 handler 执行时，会遵守这个 strand 的串行化规则。",[29,6032],{},[32,6034,6036],{"id":6035},"section-summary","Section Summary",[13,6038,6039],{},"You should now remember:",[511,6041,6042,6047,6053,6058,6064,6070,6076],{},[514,6043,6044,6046],{},[17,6045,379],{}," is synchronous blocking.",[514,6048,6049,6052],{},[17,6050,6051],{},"timer.async_wait()"," registers an asynchronous task and does not block.",[514,6054,6055,6057],{},[17,6056,527],{}," is the entry point for the event loop.",[514,6059,6060,6061,6063],{},"A thread ",[17,6062,5006],{},", callbacks are executed sequentially within this thread.",[514,6065,6066,6067,6069],{},"Multiple threads ",[17,6068,5006],{},", callbacks may be executed by different threads.",[514,6071,6072,6073,6075],{},"When multiple threads share data, use ",[17,6074,4996],{}," to avoid concurrent callbacks.",[514,6077,6078],{},"The standard syntax for binding a member function in a class is:",[52,6080,6082],{"className":54,"code":6081,"language":56,"meta":57,"style":57},"std::bind(&ClassName::member_function,\n          this,\n          std::placeholders::_1,\n          std::placeholders::_2)\n",[17,6083,6084,6102,6109,6120],{"__ignoreMap":57},[61,6085,6086,6088,6090,6092,6094,6096,6099],{"class":63,"line":64},[61,6087,175],{"class":104},[61,6089,137],{"class":108},[61,6091,824],{"class":104},[61,6093,188],{"class":108},[61,6095,609],{"class":67},[61,6097,6098],{"class":104},"ClassName",[61,6100,6101],{"class":108},"::member_function,\n",[61,6103,6104,6107],{"class":63,"line":75},[61,6105,6106],{"class":191},"          this",[61,6108,1989],{"class":108},[61,6110,6111,6114,6116,6118],{"class":63,"line":83},[61,6112,6113],{"class":104},"          std",[61,6115,137],{"class":108},[61,6117,834],{"class":104},[61,6119,1553],{"class":108},[61,6121,6122,6124,6126,6128],{"class":63,"line":91},[61,6123,6113],{"class":104},[61,6125,137],{"class":108},[61,6127,834],{"class":104},[61,6129,6130],{"class":108},"::_2)\n",[6132,6133,6134],"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":57,"searchDepth":75,"depth":75,"links":6136},[6137,6146,6157,6167,6176,6185,6192,6202,6212],{"id":34,"depth":75,"text":6138,"children":6139},"Example 1: Writing a synchronous timer in an ordinary main()",[6140,6141,6142,6143,6144,6145],{"id":42,"depth":83,"text":43},{"id":49,"depth":83,"text":50},{"id":303,"depth":83,"text":304},{"id":342,"depth":83,"text":343},{"id":372,"depth":83,"text":373},{"id":403,"depth":83,"text":404},{"id":500,"depth":75,"text":6147,"children":6148},"Example 2: Writing an asynchronous timer in a regular main()",[6149,6150,6151,6152,6153,6154,6156],{"id":506,"depth":83,"text":43},{"id":540,"depth":83,"text":50},{"id":943,"depth":83,"text":304},{"id":974,"depth":83,"text":343},{"id":1020,"depth":83,"text":373},{"id":1057,"depth":83,"text":6155},"std::bind Description",{"id":1141,"depth":83,"text":404},{"id":1185,"depth":75,"text":6158,"children":6159},"Example 3: Writing two asynchronous timers in a common main()",[6160,6161,6162,6163,6164,6165],{"id":1191,"depth":83,"text":43},{"id":1222,"depth":83,"text":50},{"id":1739,"depth":83,"text":304},{"id":1770,"depth":83,"text":343},{"id":1807,"depth":83,"text":373},{"id":1833,"depth":83,"text":6166},"Fixed parameters in std::bind",{"id":1901,"depth":75,"text":6168,"children":6169},"Example 4: Writing a repeating timer in a normal main()",[6170,6171,6172,6173,6174,6175],{"id":1907,"depth":83,"text":43},{"id":1922,"depth":83,"text":50},{"id":2461,"depth":83,"text":304},{"id":2492,"depth":83,"text":343},{"id":2529,"depth":83,"text":373},{"id":2554,"depth":83,"text":2555},{"id":2601,"depth":75,"text":2602,"children":6177},[6178,6179,6180,6181,6182,6183,6184],{"id":2605,"depth":83,"text":43},{"id":2620,"depth":83,"text":50},{"id":3074,"depth":83,"text":304},{"id":3105,"depth":83,"text":343},{"id":3133,"depth":83,"text":3134},{"id":3220,"depth":83,"text":3221},{"id":3308,"depth":83,"text":3309},{"id":3389,"depth":75,"text":3390,"children":6186},[6187,6188,6189,6190,6191],{"id":3393,"depth":83,"text":43},{"id":3416,"depth":83,"text":50},{"id":4048,"depth":83,"text":304},{"id":4079,"depth":83,"text":343},{"id":4115,"depth":83,"text":373},{"id":4145,"depth":75,"text":6193,"children":6194},"Example 7: Two threads run the same io_context simultaneously.",[6195,6196,6197,6198,6199,6200],{"id":4152,"depth":83,"text":43},{"id":4170,"depth":83,"text":50},{"id":4833,"depth":83,"text":304},{"id":4864,"depth":83,"text":343},{"id":4888,"depth":83,"text":373},{"id":4909,"depth":83,"text":6201},"std::thread in std::bind",{"id":4992,"depth":75,"text":6203,"children":6204},"Example 8: Using strand in Multithreading to Avoid Callback Concurrency",[6205,6206,6207,6208,6209,6210],{"id":5000,"depth":83,"text":43},{"id":5024,"depth":83,"text":50},{"id":5908,"depth":83,"text":304},{"id":5939,"depth":83,"text":343},{"id":5969,"depth":83,"text":373},{"id":5998,"depth":83,"text":6211},"bind_executor Description",{"id":6035,"depth":75,"text":6036},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","2100-0100-0100","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","en-us:2023-10-05-cplusplus-jiao-xue","\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO",false,null,"en-US","en-us",{},{"title":5,"description":57},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","Z3H0XCtlPFxTmjS0okeh-I5zQyU5-r5IbbwjsmycqFE",[6232,6238,6243,6248,6253,6258,6263,6268,6273,6278,6283,6288,6293,6298,6303,6308,6313,6318,6323,6328,6333,6338,6343,6348,6353,6358,6363,6368,6373,6378,6383,6388,6393,6398,6403,6408,6413,6418,6423,6428,6433,6438,6443,6448,6453,6458,6463,6468,6473,6478,6482,6487,6492,6497,6502,6507,6512,6517,6522,6527,6532,6537,6542,6547,6548,6553,6558,6563,6568,6573,6578,6583,6588,6593,6598,6603,6608,6613,6618,6623,6628,6633],{"path":6233,"stem":6234,"title":6235,"date":6215,"chapterOrder":6236,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++ Development Environment Setup and Testing","0100",0,{"path":6239,"stem":6240,"title":6241,"date":6215,"chapterOrder":6242,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++ Basics","0200",{"path":6244,"stem":6245,"title":6246,"date":6215,"chapterOrder":6247,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","Data Types and Data Storage","0300",{"path":6249,"stem":6250,"title":6251,"date":6215,"chapterOrder":6252,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","Input and Output","0400",{"path":6254,"stem":6255,"title":6256,"date":6215,"chapterOrder":6257,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","operator","0500",{"path":6259,"stem":6260,"title":6261,"date":6215,"chapterOrder":6262,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","program flow structure","0600",{"path":6264,"stem":6265,"title":6266,"date":6215,"chapterOrder":6267,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":6269,"stem":6270,"title":6271,"date":6215,"chapterOrder":6272,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","Functions and Header Files","0800",{"path":6274,"stem":6275,"title":6276,"date":6215,"chapterOrder":6277,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":6279,"stem":6280,"title":6281,"date":6215,"chapterOrder":6282,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","Structures and Unions","1000",{"path":6284,"stem":6285,"title":6286,"date":6215,"chapterOrder":6287,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","Memory Partitioning and Lifecycle","1100",{"path":6289,"stem":6290,"title":6291,"date":6215,"chapterOrder":6292,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":6294,"stem":6295,"title":6296,"date":6215,"chapterOrder":6297,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","Advanced Functions and Namespaces","1300",{"path":6299,"stem":6300,"title":6301,"date":6215,"chapterOrder":6302,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","encapsulation","1400-0100",{"path":6304,"stem":6305,"title":6306,"date":6215,"chapterOrder":6307,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","Object initialization and cleanup","1400-0200",{"path":6309,"stem":6310,"title":6311,"date":6215,"chapterOrder":6312,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","Object Model and the `this` Pointer","1400-0300",{"path":6314,"stem":6315,"title":6316,"date":6215,"chapterOrder":6317,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","Friends and operator overloading","1400-0400",{"path":6319,"stem":6320,"title":6321,"date":6215,"chapterOrder":6322,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","inheritance","1400-0500",{"path":6324,"stem":6325,"title":6326,"date":6215,"chapterOrder":6327,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","polymorphism","1400-0600",{"path":6329,"stem":6330,"title":6331,"date":6215,"chapterOrder":6332,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","Classes and Objects","1400",{"path":6334,"stem":6335,"title":6336,"date":6215,"chapterOrder":6337,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","File operations","1500",{"path":6339,"stem":6340,"title":6341,"date":6215,"chapterOrder":6342,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":6344,"stem":6345,"title":6346,"date":6215,"chapterOrder":6347,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":6349,"stem":6350,"title":6351,"date":6215,"chapterOrder":6352,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","Introduction to STL","1800-0100",{"path":6354,"stem":6355,"title":6356,"date":6215,"chapterOrder":6357,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":6359,"stem":6360,"title":6361,"date":6215,"chapterOrder":6362,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string container","1800-0300",{"path":6364,"stem":6365,"title":6366,"date":6215,"chapterOrder":6367,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":6369,"stem":6370,"title":6371,"date":6215,"chapterOrder":6372,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":6374,"stem":6375,"title":6376,"date":6215,"chapterOrder":6377,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":6379,"stem":6380,"title":6381,"date":6215,"chapterOrder":6382,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue container","1800-0700",{"path":6384,"stem":6385,"title":6386,"date":6215,"chapterOrder":6387,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":6389,"stem":6390,"title":6391,"date":6215,"chapterOrder":6392,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":6394,"stem":6395,"title":6396,"date":6215,"chapterOrder":6397,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":6399,"stem":6400,"title":6401,"date":6215,"chapterOrder":6402,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","Function objects and predicates","1800-1100",{"path":6404,"stem":6405,"title":6406,"date":6215,"chapterOrder":6407,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","Common algorithms","1800-1200",{"path":6409,"stem":6410,"title":6411,"date":6215,"chapterOrder":6412,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","Level up your programming with STL.","1800",{"path":6414,"stem":6415,"title":6416,"date":6215,"chapterOrder":6417,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":6419,"stem":6420,"title":6421,"date":6215,"chapterOrder":6422,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":6424,"stem":6425,"title":6426,"date":6215,"chapterOrder":6427,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":6429,"stem":6430,"title":6431,"date":6215,"chapterOrder":6432,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":6434,"stem":6435,"title":6436,"date":6215,"chapterOrder":6437,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":6439,"stem":6440,"title":6441,"date":6215,"chapterOrder":6442,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","range-based for loop","2000-0500",{"path":6444,"stem":6445,"title":6446,"date":6215,"chapterOrder":6447,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","structured binding","2000-0600",{"path":6449,"stem":6450,"title":6451,"date":6215,"chapterOrder":6452,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":6454,"stem":6455,"title":6456,"date":6215,"chapterOrder":6457,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":6459,"stem":6460,"title":6461,"date":6215,"chapterOrder":6462,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","Smart pointer","2000-0900",{"path":6464,"stem":6465,"title":6466,"date":6215,"chapterOrder":6467,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","Rvalue references and move semantics","2000-1000",{"path":6469,"stem":6470,"title":6471,"date":6215,"chapterOrder":6472,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda expression","2000-1100",{"path":6474,"stem":6475,"title":6476,"date":6215,"chapterOrder":6477,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":6479,"stem":6480,"title":26,"date":6215,"chapterOrder":6481,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","2000-1300",{"path":6483,"stem":6484,"title":6485,"date":6215,"chapterOrder":6486,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":6488,"stem":6489,"title":6490,"date":6215,"chapterOrder":6491,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":6493,"stem":6494,"title":6495,"date":6215,"chapterOrder":6496,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":6498,"stem":6499,"title":6500,"date":6215,"chapterOrder":6501,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":6503,"stem":6504,"title":6505,"date":6215,"chapterOrder":6506,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":6508,"stem":6509,"title":6510,"date":6215,"chapterOrder":6511,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread and join","2000-1900-0100",{"path":6513,"stem":6514,"title":6515,"date":6215,"chapterOrder":6516,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":6518,"stem":6519,"title":6520,"date":6215,"chapterOrder":6521,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":6523,"stem":6524,"title":6525,"date":6215,"chapterOrder":6526,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":6528,"stem":6529,"title":6530,"date":6215,"chapterOrder":6531,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","Concurrent programming","2000-1900",{"path":6533,"stem":6534,"title":6535,"date":6215,"chapterOrder":6536,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":6538,"stem":6539,"title":6540,"date":6215,"chapterOrder":6541,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","Modules Introduction","2000-2100",{"path":6543,"stem":6544,"title":6545,"date":6215,"chapterOrder":6546,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","Modern C++","2000",{"path":6213,"stem":6229,"title":5,"date":6215,"chapterOrder":6214,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},{"path":6549,"stem":6550,"title":6551,"date":6215,"chapterOrder":6552,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio Basics","2100-0100-0200",{"path":6554,"stem":6555,"title":6556,"date":6215,"chapterOrder":6557,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","serial communication","2100-0100-0300",{"path":6559,"stem":6560,"title":6561,"date":6215,"chapterOrder":6562,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP communication","2100-0100-0400",{"path":6564,"stem":6565,"title":6566,"date":6215,"chapterOrder":6567,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP communication","2100-0100-0500",{"path":6569,"stem":6570,"title":6571,"date":6215,"chapterOrder":6572,"chapterDepth":75,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","Robot Engineering Approach and ROS2 Integration","2100-0100-0600",{"path":6574,"stem":6575,"title":6576,"date":6215,"chapterOrder":6577,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio asynchronous IO library","2100-0100",{"path":6579,"stem":6580,"title":6581,"date":6215,"chapterOrder":6582,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen linear algebra library","2100-0200",{"path":6584,"stem":6585,"title":6586,"date":6215,"chapterOrder":6587,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV Computer Vision Library","2100-0300",{"path":6589,"stem":6590,"title":6591,"date":6215,"chapterOrder":6592,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL Point Cloud Library","2100-0400",{"path":6594,"stem":6595,"title":6596,"date":6215,"chapterOrder":6597,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus Lie group and Lie algebra library","2100-0500",{"path":6599,"stem":6600,"title":6601,"date":6215,"chapterOrder":6602,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","Learning Common Libraries","2100",{"path":6604,"stem":6605,"title":6606,"date":6215,"chapterOrder":6607,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets and Build Installation","2200-0100",{"path":6609,"stem":6610,"title":6611,"date":6215,"chapterOrder":6612,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","Top-level CMake and Public Compilation Options","2200-0200",{"path":6614,"stem":6615,"title":6616,"date":6215,"chapterOrder":6617,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","Detailed CMake Explanation for src and lib Modules","2200-0300",{"path":6619,"stem":6620,"title":6621,"date":6215,"chapterOrder":6622,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","How to write third-party library dependencies","2200-0400",{"path":6624,"stem":6625,"title":6626,"date":6215,"chapterOrder":6627,"chapterDepth":64,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","Template Extensions and FAQ","2200-0500",{"path":6629,"stem":6630,"title":6631,"date":6215,"chapterOrder":6632,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":6222},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake Project Template","2200",{"path":6218,"stem":6634,"title":6635,"date":6215,"chapterOrder":6223,"chapterDepth":6237,"docKey":6217,"docRoot":6218,"docTitle":6219,"isWikiDoc":94,"isWikiIndex":94},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":6637},[6638,6639,6642,6645,6648],{"path":6213,"localeSlug":6225,"i18nKey":6221},{"path":6640,"localeSlug":6641,"i18nKey":6221},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","zh-hant",{"path":6643,"localeSlug":6644,"i18nKey":6221},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","zh-hk",{"path":6646,"localeSlug":6647,"i18nKey":6221},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","zh-tw",{"path":6649,"localeSlug":6650,"i18nKey":6221},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","zh-cn",[6213,6228,6640,6228,6643,6228,6646,6228,6649,6228],1784646870633]