{"id":7434,"date":"2026-07-22T12:19:12","date_gmt":"2026-07-22T04:19:12","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7434"},"modified":"2026-07-22T12:19:12","modified_gmt":"2026-07-22T04:19:12","slug":"%e8%81%8a%e8%81%8a-stdpackaged_task-%e6%88%96%e7%ba%bf%e7%a8%8b%e6%b1%a0","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7434","title":{"rendered":"\u804a\u804a std::packaged_task \u6216\u7ebf\u7a0b\u6c60"},"content":{"rendered":"<div data-rs-index=\"20\" data-index=\"20\">\n<div tabindex=\"0\" role=\"article\" aria-setsize=\"30\" aria-posinset=\"21\" aria-label=\"Message 21 of 30\">\n<div data-test-render-count=\"1\">\n<div class=\"mb-1 mt-[var(--msg-gap,1.5rem)] group group\/message-row\">\n<div class=\"flex flex-col items-end gap-1\">\n<div class=\"group relative inline-flex gap-2 bg-bg-300 dark:[[data-darker-default]_&amp;]:bg-bg-000 rounded-xl pl-2.5 py-[var(--msg-bubble-py,0.625rem)] break-words text-text-100 transition-all max-w-[75ch] flex-col !px-[var(--msg-bubble-px,1rem)] max-w-[85%]\" data-user-message-bubble=\"true\">\n<div class=\"flex flex-row gap-2 relative\">\n<div class=\"flex-1\">\n<div class=\"font-large !font-user-message py-0.5 grid grid-cols-1 gap-2 relative [&amp;_ul]:!space-y-0 [&amp;_ol]:!space-y-0 [&amp;_ul]:pl-8 [&amp;_ol]:pl-8\" data-testid=\"user-message\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div data-rs-index=\"21\" data-index=\"21\">\n<div tabindex=\"-1\" role=\"article\" aria-setsize=\"30\" aria-posinset=\"22\" aria-label=\"Message 22 of 30\">\n<div data-test-render-count=\"1\">\n<div class=\"group group\/message-row\">\n<div class=\"contents\">\n<div class=\"group relative relative pb-[var(--msg-assistant-pb,0.75rem)]\" data-is-streaming=\"false\">\n<div class=\"font-claude-response relative leading-[1.65rem] [&amp;_pre&gt;div]:bg-bg-000\/50 [&amp;_pre&gt;div]:border-0.5 [&amp;_pre&gt;div]:border-border-400 [&amp;_.ignore-pre-bg&gt;div]:bg-transparent [&amp;_.standard-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.standard-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8 [&amp;_.progressive-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.progressive-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8\">\n<div class=\"standard-markdown grid-cols-1 grid [&amp;_&gt;_*]:min-w-0 gap-3 [&amp;_&gt;_*:last-child]:mb-0 print:block print:[&amp;_&gt;_*_+_*]:mt-3 standard-markdown\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.375rem] font-bold\" dir=\"ltr\">\u4e00\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">std::packaged_task<\/code>\uff1a\u628a\u51fd\u6570\u5305\u88c5\u6210\u53ef\u8c03\u5ea6\u7684\u4efb\u52a1<\/h2>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u5b83\u89e3\u51b3\u4e86\u4ec0\u4e48\u95ee\u9898\uff1f<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">std::async<\/code>\u00a0\u5f88\u65b9\u4fbf\uff0c\u4f46<strong>\u542f\u52a8\u65f6\u673a\u4e0d\u53ef\u63a7<\/strong>\uff08\u8981\u4e48\u7acb\u5373\u8d77\u7ebf\u7a0b\uff0c\u8981\u4e48\u8c03\u7528\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">get()<\/code>\u00a0\u65f6\u624d\u6267\u884c\uff09\u3002\u5982\u679c\u4f60\u60f3<strong>\u81ea\u5df1\u7ba1\u7406\u4efb\u52a1\u7684\u6267\u884c\u65f6\u673a<\/strong>\uff08\u6bd4\u5982\u4e22\u8fdb\u7ebf\u7a0b\u6c60\u6392\u961f\uff09\uff0c\u5c31\u9700\u8981\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">packaged_task<\/code>\u3002<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;future&gt;\r\n\r\nint compute(int x) { return x * x; }\r\n\r\n\/\/ \u628a\u666e\u901a\u51fd\u6570\"\u5305\u88c5\"\u6210\u4e00\u4e2a\u4efb\u52a1\u5bf9\u8c61\r\nstd::packaged_task&lt;int(int)&gt; task(compute);\r\n\r\n\/\/ \u62ff\u5230\u5173\u8054\u7684 future\uff08\u6b64\u65f6\u4efb\u52a1\u8fd8\u6ca1\u6267\u884c\uff01\uff09\r\nstd::future&lt;int&gt; fut = task.get_future();\r\n\r\n\/\/ \u4efb\u52a1\u53ef\u4ee5\u88ab\u5b58\u8d77\u6765\u3001\u4f20\u9012\u3001\u7a0d\u540e\u518d\u6267\u884c\r\ntask(10);  \/\/ \u624b\u52a8\u6267\u884c\uff0c\u6b64\u65f6\u624d\u771f\u6b63\u8c03\u7528 compute(10)\r\n\r\nstd::cout &lt;&lt; fut.get();  \/\/ \u2192 100<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u5173\u952e\u7279\u6027\uff1a\u4efb\u52a1\u548c&#8221;\u4f55\u65f6\u6267\u884c&#8221;\u89e3\u8026<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">std::packaged_task&lt;int(int)&gt; task(compute);\r\nstd::future&lt;int&gt; fut = task.get_future();\r\n\r\n\/\/ \u4efb\u52a1\u53ef\u4ee5\u88ab move \u5230\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u53bb\u6267\u884c\r\nstd::thread t(std::move(task), 10);\r\nt.join();\r\n\r\nstd::cout &lt;&lt; fut.get();  \/\/ \u2192 100<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<blockquote class=\"ml-2 border-l-4 border-[hsl(var(--border-300)\/0.1)] pl-4 text-text-300\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u672c\u8d28<\/strong>\uff1a<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">packaged_task<\/code>\u00a0= \u4e00\u4e2a<strong>\u53ef\u8c03\u7528\u5bf9\u8c61<\/strong>\u00a0+ \u81ea\u52a8\u7ba1\u7406\u7684\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">promise<\/code>\u3002\u8c03\u7528\u5b83\u65f6\uff0c\u8fd4\u56de\u503c\u81ea\u52a8\u5b58\u8fdb\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">promise<\/code>\uff0c\u518d\u901a\u8fc7\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">future<\/code>\u00a0\u53d6\u51fa\u3002<\/p>\n<\/blockquote>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e3a\u4ec0\u4e48\u4e0d\u76f4\u63a5\u7528\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">std::async<\/code>\uff1f<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ std::async\uff1a\u7acb\u5373\u51b3\u5b9a\u6267\u884c\u65b9\u5f0f\uff0c\u4f60\u65e0\u6cd5\"\u5b58\u8d77\u6765\u7a0d\u540e\u8dd1\"\r\nauto fut = std::async(std::launch::async, compute, 10);\r\n\r\n\/\/ packaged_task\uff1a\u4f60\u5b8c\u5168\u63a7\u5236\"\u4f55\u65f6\"\"\u5728\u54ea\"\u6267\u884c\uff0c\u53ef\u4ee5\u653e\u8fdb\u961f\u5217\r\nstd::queue&lt;std::packaged_task&lt;void()&gt;&gt; taskQueue;\r\ntaskQueue.push(std::packaged_task&lt;void()&gt;([]{ \/* ... *\/ }));\r\n\/\/ \u7ebf\u7a0b\u6c60\u7684 worker \u7ebf\u7a0b\u4ece\u961f\u5217\u91cc\u53d6\u51fa\u6765\u6267\u884c<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u8fd9\u6b63\u662f\u7ebf\u7a0b\u6c60\u7684\u6838\u5fc3\u6784\u5efa\u5757<\/strong>\u2014\u2014\u628a\u4efb\u52a1&#8221;\u6253\u5305&#8221;\u653e\u8fdb\u961f\u5217\uff0c\u5de5\u4f5c\u7ebf\u7a0b\u8d1f\u8d23\u53d6\u51fa\u5e76\u6267\u884c\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.375rem] font-bold\" dir=\"ltr\">\u4e8c\u3001\u7ebf\u7a0b\u6c60\uff1a\u4e3a\u4ec0\u4e48\u9700\u8981\u5b83\uff1f<\/h2>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u95ee\u9898\uff1a\u9891\u7e41\u521b\u5efa\/\u9500\u6bc1\u7ebf\u7a0b\uff0c\u5f00\u9500\u5f88\u5927<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u274c \u6bcf\u4e2a\u4efb\u52a1\u90fd\u5f00\u4e00\u4e2a\u65b0\u7ebf\u7a0b\uff0c10000\u4e2a\u4efb\u52a1 = 10000\u6b21\u7cfb\u7edf\u8c03\u7528\u5f00\u9500\r\nfor (int i = 0; i &lt; 10000; i++) {\r\n    std::thread t([i] { compute(i); });\r\n    t.detach();  \/\/ \u6781\u5ea6\u4f4e\u6548\uff0c\u4e14\u96be\u4ee5\u63a7\u5236\u5e76\u53d1\u6570\u91cf\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7ebf\u7a0b\u521b\u5efa\u6d89\u53ca\u7cfb\u7edf\u8c03\u7528\u3001\u6808\u5206\u914d\u7b49\uff0c<strong>\u5f00\u9500\u8fdc\u5927\u4e8e\u4e00\u6b21\u51fd\u6570\u8c03\u7528<\/strong>\u3002\u7ebf\u7a0b\u6c60\u7684\u601d\u8def\uff1a<strong>\u63d0\u524d\u521b\u5efa\u56fa\u5b9a\u6570\u91cf\u7684\u7ebf\u7a0b\uff0c\u53cd\u590d\u590d\u7528\uff0c\u4efb\u52a1\u6392\u961f\u7b49\u5f85\u7a7a\u95f2\u7ebf\u7a0b\u5904\u7406<\/strong>\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u7ebf\u7a0b\u6c60\u67b6\u6784\u56fe<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u4efb\u52a1\u63d0\u4ea4                \u4efb\u52a1\u961f\u5217                \u5de5\u4f5c\u7ebf\u7a0b\u6c60\r\n   \u2502                       \u2502                        \u2502\r\nsubmit(task1) \u2500\u2500\u2510          \u2502                  \u250c\u2500\u25ba Thread1 (\u5faa\u73af\u53d6\u4efb\u52a1\u6267\u884c)\r\nsubmit(task2) \u2500\u2500\u253c\u2500\u2500\u25ba [task1, task2, task3] \u2500\u2500\u2500\u253c\u2500\u25ba Thread2 (\u5faa\u73af\u53d6\u4efb\u52a1\u6267\u884c)\r\nsubmit(task3) \u2500\u2500\u2518          \u2502                  \u2514\u2500\u25ba Thread3 (\u5faa\u73af\u53d6\u4efb\u52a1\u6267\u884c)\r\n                            \u2502\r\n                     \uff08\u7ebf\u7a0b\u6570\u91cf\u56fa\u5b9a\uff0c\r\n                      \u4e0d\u968f\u4efb\u52a1\u6570\u589e\u957f\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u7b80\u5316\u7248\u7ebf\u7a0b\u6c60\u5b9e\u73b0<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;vector&gt;\r\n#include &lt;queue&gt;\r\n#include &lt;thread&gt;\r\n#include &lt;mutex&gt;\r\n#include &lt;condition_variable&gt;\r\n#include &lt;functional&gt;\r\n#include &lt;future&gt;\r\n\r\nclass ThreadPool {\r\npublic:\r\n    ThreadPool(size_t numThreads) : stop(false) {\r\n        for (size_t i = 0; i &lt; numThreads; ++i) {\r\n            workers.emplace_back([this] { workerLoop(); });\r\n        }\r\n    }\r\n\r\n    \/\/ \u63d0\u4ea4\u4efb\u610f\u53ef\u8c03\u7528\u5bf9\u8c61\uff0c\u8fd4\u56de future \u83b7\u53d6\u7ed3\u679c\r\n    template&lt;typename F, typename... Args&gt;\r\n    auto submit(F&amp;&amp; f, Args&amp;&amp;... args) \r\n        -&gt; std::future&lt;std::invoke_result_t&lt;F, Args...&gt;&gt; \r\n    {\r\n        using ReturnType = std::invoke_result_t&lt;F, Args...&gt;;\r\n\r\n        \/\/ \u7528 packaged_task \u5305\u88c5\u4efb\u52a1\uff08\u7ed1\u5b9a\u53c2\u6570\uff09\r\n        auto task = std::make_shared&lt;std::packaged_task&lt;ReturnType()&gt;&gt;(\r\n            std::bind(std::forward&lt;F&gt;(f), std::forward&lt;Args&gt;(args)...)\r\n        );\r\n\r\n        std::future&lt;ReturnType&gt; result = task-&gt;get_future();\r\n\r\n        {\r\n            std::lock_guard&lt;std::mutex&gt; lock(queueMutex);\r\n            tasks.emplace([task] { (*task)(); });  \/\/ \u5305\u88c5\u6210 void() \u653e\u5165\u961f\u5217\r\n        }\r\n        condition.notify_one();  \/\/ \u5524\u9192\u4e00\u4e2a\u7b49\u5f85\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\r\n\r\n        return result;\r\n    }\r\n\r\n    ~ThreadPool() {\r\n        {\r\n            std::lock_guard&lt;std::mutex&gt; lock(queueMutex);\r\n            stop = true;\r\n        }\r\n        condition.notify_all();\r\n        for (auto&amp; worker : workers) worker.join();\r\n    }\r\n\r\nprivate:\r\n    void workerLoop() {\r\n        while (true) {\r\n            std::function&lt;void()&gt; task;\r\n            {\r\n                std::unique_lock&lt;std::mutex&gt; lock(queueMutex);\r\n                \/\/ \u7b49\u5f85\uff1a\u6709\u4efb\u52a1 \u6216 \u7ebf\u7a0b\u6c60\u8981\u5173\u95ed\r\n                condition.wait(lock, [this] { \r\n                    return stop || !tasks.empty(); \r\n                });\r\n\r\n                if (stop &amp;&amp; tasks.empty()) return;  \/\/ \u9000\u51fa\u6761\u4ef6\r\n\r\n                task = std::move(tasks.front());\r\n                tasks.pop();\r\n            }\r\n            task();  \/\/ \u6267\u884c\u4efb\u52a1\uff08\u9501\u5916\u6267\u884c\uff0c\u4e0d\u963b\u585e\u5176\u4ed6\u7ebf\u7a0b\u53d6\u4efb\u52a1\uff09\r\n        }\r\n    }\r\n\r\n    std::vector&lt;std::thread&gt; workers;\r\n    std::queue&lt;std::function&lt;void()&gt;&gt; tasks;\r\n    std::mutex queueMutex;\r\n    std::condition_variable condition;\r\n    bool stop;\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4f7f\u7528\u793a\u4f8b<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">int main() {\r\n    ThreadPool pool(4);  \/\/ 4\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\r\n\r\n    std::vector&lt;std::future&lt;int&gt;&gt; results;\r\n\r\n    \/\/ \u63d0\u4ea4100\u4e2a\u4efb\u52a1\uff0c\u4f46\u53ea\u75284\u4e2a\u7ebf\u7a0b\u5904\u7406\r\n    for (int i = 0; i &lt; 100; ++i) {\r\n        results.push_back(pool.submit([i] {\r\n            return i * i;\r\n        }));\r\n    }\r\n\r\n    \/\/ \u53d6\u51fa\u6240\u6709\u7ed3\u679c\r\n    for (auto&amp; fut : results) {\r\n        std::cout &lt;&lt; fut.get() &lt;&lt; \" \";\r\n    }\r\n    \/\/ \u8f93\u51fa 0 1 4 9 16 25 ... 9801\uff08\u4efb\u52a1\u57284\u4e2a\u7ebf\u7a0b\u95f4\u81ea\u52a8\u8c03\u5ea6\u5b8c\u6210\uff09\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u5173\u952e\u8bbe\u8ba1\u70b9\u9010\u4e2a\u62c6\u89e3<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">1\ufe0f\u20e3 \u4e3a\u4ec0\u4e48\u7528\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">condition_variable<\/code>\uff1f<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-cpp\">condition.wait(lock, [this] { return stop || !tasks.empty(); });<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6ca1\u6709\u4efb\u52a1\u65f6\uff0c\u5de5\u4f5c\u7ebf\u7a0b<strong>\u4f11\u7720<\/strong>\u800c\u4e0d\u662f\u7a7a\u8f6c\u68c0\u67e5\uff08\u907f\u514d\u6d6a\u8d39 CPU\uff09\u3002\u6709\u65b0\u4efb\u52a1\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">notify_one()<\/code>\u00a0\u65f6\u624d\u88ab\u5524\u9192\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">2\ufe0f\u20e3 \u4e3a\u4ec0\u4e48\u7528\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">std::function&lt;void()&gt;<\/code>\u00a0\u5b58\u4efb\u52a1\uff1f<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4e0d\u540c\u4efb\u52a1\u7684\u8fd4\u56de\u7c7b\u578b\u3001\u53c2\u6570\u90fd\u4e0d\u540c\uff08<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">int(int)<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">void()<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">string(double)<\/code>\u2026\uff09\u3002\u7528\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">packaged_task<\/code>\u00a0\u5305\u88c5\u540e\uff0c\u7edf\u4e00\u62b9\u5e73\u6210\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">void()<\/code>\u2014\u2014<strong>\u7c7b\u578b\u64e6\u9664<\/strong>\uff0c\u65b9\u4fbf\u7edf\u4e00\u5b58\u8fdb\u961f\u5217\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">3\ufe0f\u20e3 \u4e3a\u4ec0\u4e48\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">submit<\/code>\u00a0\u8981\u8fd4\u56de\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">future<\/code>\uff1f<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8c03\u7528\u65b9\u9700\u8981\u77e5\u9053\u4efb\u52a1<strong>\u4f55\u65f6\u5b8c\u6210\u3001\u7ed3\u679c\u662f\u4ec0\u4e48<\/strong>\u2014\u2014\u8fd9\u6b63\u662f\u524d\u9762\u8bb2\u7684\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">future<\/code>\/<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">promise<\/code>\u00a0\u673a\u5236\u7684\u590d\u7528\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e09\u8005\u5173\u7cfb\u4e32\u8054\u8d77\u6765\u770b<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">std::thread      \u2500\u2500\u25ba \u6700\u5e95\u5c42\uff1a\u624b\u52a8\u7ba1\u7406\u5355\u4e2a\u7ebf\u7a0b\uff0c\u65e0\u8fd4\u56de\u503c\r\n       \u2502\r\nstd::async        \u2500\u2500\u25ba \u81ea\u52a8\u5f00\u7ebf\u7a0b + \u8fd4\u56de future\uff0c\u4f46\u4e0d\u53ef\u63a7\u5236\u8c03\u5ea6\r\n       \u2502\r\nstd::packaged_task \u2500\u2500\u25ba \u4efb\u52a1\u548c\u6267\u884c\u89e3\u8026\uff0c\u53ef\u4ee5\u5b58\u50a8\u3001\u4f20\u9012\u3001\u5ef6\u8fdf\u6267\u884c\r\n       \u2502\r\n\u7ebf\u7a0b\u6c60             \u2500\u2500\u25ba packaged_task + \u961f\u5217 + \u56fa\u5b9a\u7ebf\u7a0b\u6570\uff0c\r\n                       \u5b9e\u73b0\"\u4efb\u52a1\u6392\u961f\u3001\u7ebf\u7a0b\u590d\u7528\"\u7684\u5de5\u7a0b\u7ea7\u65b9\u6848<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e00\u53e5\u8bdd\u603b\u7ed3<\/h3>\n<blockquote class=\"ml-2 border-l-4 border-[hsl(var(--border-300)\/0.1)] pl-4 text-text-300\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">packaged_task<\/code>\u00a0\u662f&#8221;\u6253\u5305\u597d\u7684\u3001\u5f85\u6267\u884c\u7684\u51fd\u6570+future&#8221;\uff1b\u7ebf\u7a0b\u6c60\u5219\u662f\u7528<strong>\u4efb\u52a1\u961f\u5217 + \u56fa\u5b9a\u7ebf\u7a0b\u6570 + \u6761\u4ef6\u53d8\u91cf<\/strong>\uff0c\u628a\u5927\u91cf&#8221;\u6253\u5305\u4efb\u52a1&#8221;\u9ad8\u6548\u5730\u5206\u53d1\u7ed9\u5c11\u91cf\u7ebf\u7a0b\u6267\u884c\uff0c\u907f\u514d\u9891\u7e41\u521b\u5efa\u9500\u6bc1\u7ebf\u7a0b\u7684\u5f00\u9500\u3002\u8fd9\u662f\u51e0\u4e4e\u6240\u6709\u9ad8\u5e76\u53d1 C++ \u670d\u52a1\u7aef\u6846\u67b6\u7684\u57fa\u7840\u6784\u4ef6\u3002<\/p>\n<\/blockquote>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u60f3\u7ee7\u7eed\u770b C++20 \u7684\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">std::jthread<\/code>\uff08\u81ea\u52a8 join \u7684\u7ebf\u7a0b\uff09\u6216\u8005\u66f4\u8fdb\u9636\u7684<strong>\u65e0\u9501\u961f\u5217<\/strong>\u4f18\u5316\u7ebf\u7a0b\u6c60\u6027\u80fd\u5417\uff1f<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001std::packaged_task<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[],"class_list":["post-7434","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7434"}],"version-history":[{"count":1,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7434\/revisions"}],"predecessor-version":[{"id":7435,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7434\/revisions\/7435"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}