{"id":7560,"date":"2026-08-01T00:00:50","date_gmt":"2026-07-31T16:00:50","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7560"},"modified":"2026-08-01T00:00:50","modified_gmt":"2026-07-31T16:00:50","slug":"stdweak_ptr-%e7%9a%84-lock%e6%93%8d%e4%bd%9c%e5%88%b0%e5%ba%95%e5%81%9a%e4%ba%86%e4%bb%80%e4%b9%88%ef%bc%9f%e5%a6%82%e6%9e%9c%e5%af%b9%e8%b1%a1%e5%b7%b2%e8%a2%ab%e5%9b%9e%e6%94%b6%ef%bc%8c","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7560","title":{"rendered":"std::weak_ptr \u7684 lock()\u64cd\u4f5c\u5230\u5e95\u505a\u4e86\u4ec0\u4e48\uff1f\u5982\u679c\u5bf9\u8c61\u5df2\u88ab\u56de\u6536\uff0c\u662f\u8fd4\u56denullptr\uff1f\u4ed6\u5982\u4f55\u77e5\u9053\u5bf9\u8c61\u662f\u5426\u88ab\u56de\u6536\u7684\uff1f"},"content":{"rendered":"<div data-rs-index=\"32\" data-index=\"32\">\n<div tabindex=\"0\" role=\"article\" aria-setsize=\"34\" aria-posinset=\"33\" aria-label=\"Message 33 of 34\">\n<div data-test-render-count=\"2\">\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=\"33\" data-index=\"33\" data-last-message=\"true\">\n<div tabindex=\"-1\" role=\"article\" aria-setsize=\"34\" aria-posinset=\"34\" aria-label=\"Message 34 of 34\">\n<div data-test-render-count=\"1\">\n<div class=\"group group\/message-row\">\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=\"grid grid-rows-[auto_auto] min-w-0\">\n<div class=\"row-start-2 col-start-1 relative grid grid-rows-[auto_auto] isolate min-w-0\">\n<div class=\"row-start-1 col-start-1 relative z-[2] min-w-0\">\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\">\u8fd9\u4e2a\u95ee\u9898\u95ee\u5230\u4e86\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]\">weak_ptr<\/code>\u00a0\u7684\u6838\u5fc3\u5b9e\u73b0\uff0c\u662f Senior \u9762\u8bd5\u91cc\u5c11\u6709\u4eba\u80fd\u5b8c\u6574\u56de\u7b54\u7684\u4e00\u9053\u9898\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\">\u5148\u770b\u5185\u5b58\u5e03\u5c40<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7406\u89e3\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]\">lock()<\/code>\u00a0\u4e4b\u524d\uff0c\u5fc5\u987b\u5148\u77e5\u9053\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]\">shared_ptr<\/code>\u00a0\u548c\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]\">weak_ptr<\/code>\u00a0\u5171\u4eab\u7684\u63a7\u5236\u5757\u957f\u4ec0\u4e48\u6837\uff1a<\/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=\"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\">make_shared&lt;T&gt;() \u4e4b\u540e\u7684\u5185\u5b58\u5e03\u5c40\uff1a\r\n\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502           Control Block                 \u2502\r\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502\r\n\u2502  \u2502  use_count  (atomic&lt;long&gt;) = 1  \u2502   \u2502  \u2190 \u5f3a\u5f15\u7528\u8ba1\u6570\r\n\u2502  \u2502  weak_count (atomic&lt;long&gt;) = 1  \u2502   \u2502  \u2190 \u5f31\u5f15\u7528\u8ba1\u6570\uff08\u521d\u59cb\u4e3a1\uff0c\u542b\u4e49\u4e0b\u9762\u89e3\u91ca\uff09\r\n\u2502  \u2502  deleter                        \u2502   \u2502\r\n\u2502  \u2502  allocator                      \u2502   \u2502\r\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502\r\n\u2502           Object Data (T)              \u2502  \u2190 make_shared \u65f6\u548c\u63a7\u5236\u5757\u5728\u4e00\u8d77\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n         \u2191                    \u2191\r\n    weak_ptr \u6301\u6709          shared_ptr \u6301\u6709\r\n    \uff08\u6307\u5411\u63a7\u5236\u5757\uff09          \uff08\u6307\u5411\u63a7\u5236\u5757 + \u5bf9\u8c61\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5173\u952e\u8bbe\u8ba1\uff1a<strong><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]\">weak_ptr<\/code>\u00a0\u53ea\u6301\u6709\u6307\u5411\u63a7\u5236\u5757\u7684\u6307\u9488\uff0c\u4e0d\u6301\u6709\u5bf9\u8c61\u6307\u9488\u3002\u63a7\u5236\u5757\u7684\u751f\u547d\u5468\u671f\u72ec\u7acb\u4e8e\u5bf9\u8c61\u672c\u8eab\u3002<\/strong><\/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\">use_count \u548c weak_count \u7684\u8bed\u4e49<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4e24\u4e2a\u8ba1\u6570\u5668\u7684\u7cbe\u786e\u542b\u4e49\uff1a<\/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=\"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\">use_count  = \u5f53\u524d\u5b58\u6d3b\u7684 shared_ptr \u6570\u91cf\r\n\r\nweak_count = \u5f53\u524d\u5b58\u6d3b\u7684 weak_ptr \u6570\u91cf + 1\r\n             \uff08\u8fd9\u4e2a +1 \u4ee3\u8868\"\u81f3\u5c11\u8fd8\u6709\u4e00\u4e2a shared_ptr \u5b58\u5728\"\u8fd9\u4ef6\u4e8b\u672c\u8eab\uff09\r\n\r\n\u89e6\u53d1\u6761\u4ef6\uff1a\r\n  use_count  \u964d\u4e3a 0 \u2192 \u9500\u6bc1\u5bf9\u8c61\uff08\u8c03\u7528\u6790\u6784\u51fd\u6570\uff0c\u91ca\u653e\u5bf9\u8c61\u5185\u5b58\uff09\r\n  weak_count \u964d\u4e3a 0 \u2192 \u9500\u6bc1\u63a7\u5236\u5757\uff08\u91ca\u653e\u63a7\u5236\u5757\u5185\u5b58\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\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]\">weak_count<\/code>\u00a0\u521d\u59cb\u662f 1 \u800c\u4e0d\u662f 0\uff1f\u56e0\u4e3a\u8981\u628a&#8221;\u6709\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]\">shared_ptr<\/code>\u00a0\u5b58\u5728&#8221;\u8fd9\u4ef6\u4e8b\u4e5f\u8ba1\u5165\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]\">weak_count<\/code>\uff0c\u5f53\u6700\u540e\u4e00\u4e2a\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]\">shared_ptr<\/code>\u00a0\u88ab\u9500\u6bc1\u65f6\uff0c<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]\">use_count<\/code>\u00a0\u964d\u4e3a 0\uff0c\u540c\u65f6\u628a\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]\">weak_count<\/code>\u00a0\u51cf 1\u3002\u8fd9\u6837\u53ea\u8981\u8fd8\u6709\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]\">weak_ptr<\/code>\u00a0\u5b58\u5728\uff0c<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]\">weak_count<\/code>\u00a0\u5c31\u4e0d\u4f1a\u5230 0\uff0c\u63a7\u5236\u5757\u5c31\u4e0d\u4f1a\u88ab\u91ca\u653e\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7528\u65f6\u95f4\u7ebf\u6765\u770b\uff1a<\/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=\"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\">\u521d\u59cb\uff1a\r\n  shared_ptr a = make_shared&lt;Player&gt;();\r\n  use_count=1, weak_count=1\r\n\r\n\u52a0\u4e00\u4e2a weak_ptr\uff1a\r\n  weak_ptr&lt;Player&gt; w = a;\r\n  use_count=1, weak_count=2\r\n\r\nshared_ptr \u9500\u6bc1\uff1a\r\n  a.reset();  \u6216 a \u51fa\u4f5c\u7528\u57df\r\n  \u2192 use_count \u964d\u4e3a 0\r\n  \u2192 \u9500\u6bc1 Player \u5bf9\u8c61\uff08\u6790\u6784\u51fd\u6570 + \u91ca\u653e\u5185\u5b58\uff09\r\n  \u2192 weak_count \u51cf 1\uff0c\u53d8\u4e3a 1\r\n  \u2192 \u63a7\u5236\u5757\u8fd8\u6d3b\u7740\uff01\r\n\r\n\u6b64\u65f6 w \u8fd8\u6301\u6709\u4e00\u4e2a\u6307\u5411\u63a7\u5236\u5757\u7684\u6307\u9488\uff1a\r\n  w \u77e5\u9053 use_count=0\uff0c\u5bf9\u8c61\u5df2\u6b7b\r\n\r\nweak_ptr \u4e5f\u9500\u6bc1\uff1a\r\n  w \u51fa\u4f5c\u7528\u57df\r\n  \u2192 weak_count \u51cf 1\uff0c\u53d8\u4e3a 0\r\n  \u2192 \u91ca\u653e\u63a7\u5236\u5757\u5185\u5b58<\/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\">lock() \u7684\u5b8c\u6574\u5b9e\u73b0\u903b\u8f91<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u73b0\u5728\u53ef\u4ee5\u7cbe\u786e\u89e3\u91ca\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]\">lock()<\/code>\u00a0\u505a\u4e86\u4ec0\u4e48\uff1a<\/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\">\/\/ \u4f2a\u4ee3\u7801\uff0c\u8d34\u8fd1 libstdc++ \u5b9e\u9645\u5b9e\u73b0\r\nshared_ptr&lt;T&gt; weak_ptr&lt;T&gt;::lock() const noexcept {\r\n    \/\/ \u5173\u952e\u64cd\u4f5c\uff1a\u539f\u5b50\u5730\u68c0\u67e5 use_count \u5e76\u5c1d\u8bd5\u52a0 1\r\n    \/\/ \u5fc5\u987b\u662f\u539f\u5b50\u64cd\u4f5c\uff0c\u5426\u5219\u6709 TOCTOU \u7ade\u4e89\u6761\u4ef6\uff08\u4e0b\u9762\u8be6\u7ec6\u8bf4\uff09\r\n\r\n    long count = control_block-&gt;use_count.load(memory_order_relaxed);\r\n\r\n    while (true) {\r\n        if (count == 0) {\r\n            \/\/ \u5bf9\u8c61\u5df2\u88ab\u9500\u6bc1\uff0c\u8fd4\u56de\u7a7a\u7684 shared_ptr\uff08\u7b49\u540c\u4e8e nullptr\uff09\r\n            return shared_ptr&lt;T&gt;();\r\n        }\r\n\r\n        \/\/ \u5c1d\u8bd5\u628a use_count \u4ece count \u6539\u4e3a count+1\uff08\u539f\u5b50 CAS\uff09\r\n        if (control_block-&gt;use_count.compare_exchange_weak(\r\n                count,          \/\/ expected\r\n                count + 1,      \/\/ desired\r\n                memory_order_acquire,\r\n                memory_order_relaxed)) {\r\n            \/\/ CAS \u6210\u529f\uff1a\u6211\u4eec\u6210\u529f\"\u590d\u6d3b\"\u4e86\u4e00\u4e2a\u5f3a\u5f15\u7528\r\n            \/\/ \u6b64\u523b\u5bf9\u8c61\u4e00\u5b9a\u5b58\u6d3b\uff0c\u56e0\u4e3a use_count \u5df2\u7ecf &gt;= 1\r\n            return shared_ptr&lt;T&gt;(ptr, control_block);\r\n        }\r\n        \/\/ CAS \u5931\u8d25\uff1ause_count \u88ab\u5176\u4ed6\u7ebf\u7a0b\u6539\u4e86\uff0c\u7528\u65b0\u503c\u91cd\u8bd5\r\n        \/\/ count \u5df2\u88ab compare_exchange_weak \u66f4\u65b0\u4e3a\u5f53\u524d\u503c\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5b83\u5982\u4f55\u77e5\u9053\u5bf9\u8c61\u662f\u5426\u88ab\u56de\u6536<\/strong>\uff1a\u76f4\u63a5\u8bfb\u63a7\u5236\u5757\u91cc\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]\">use_count<\/code>\u3002<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]\">use_count == 0<\/code>\u00a0\u5c31\u610f\u5473\u7740\u5bf9\u8c61\u5df2\u9500\u6bc1\u3002\u63a7\u5236\u5757\u5728\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]\">weak_ptr<\/code>\u00a0\u5b58\u6d3b\u671f\u95f4<strong>\u6c38\u8fdc\u4e0d\u4f1a\u88ab\u91ca\u653e<\/strong>\uff0c\u6240\u4ee5\u8fd9\u4e2a\u8bfb\u64cd\u4f5c\u662f\u5b89\u5168\u7684\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u4e3a\u4ec0\u4e48\u5fc5\u987b\u7528 CAS \u800c\u4e0d\u662f\u666e\u901a\u8bfb\u5199<\/strong>\uff1a\u8fd9\u662f\u9632\u6b62\u5982\u4e0b\u7ade\u4e89\u6761\u4ef6\uff1a<\/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=\"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\">\/\/ \u5371\u9669\u7684\u975e\u539f\u5b50\u5b9e\u73b0\uff08\u5047\u8bbe\uff09\uff1a\r\n\r\n\u7ebf\u7a0b1 (lock):                    \u7ebf\u7a0b2 (reset shared_ptr):\r\n\r\n1. \u8bfb use_count\uff0c\u770b\u5230\u503c\u4e3a 1\r\n                                 2. use_count-- \u2192 \u53d8\u4e3a 0\r\n                                 3. \u9500\u6bc1 Player \u5bf9\u8c61\uff0c\u91ca\u653e\u5185\u5b58\r\n4. \u770b\u5230 use_count &gt; 0\uff0c\u51b3\u5b9a\u521b\u5efa shared_ptr\r\n5. \u8fd4\u56de\u4e00\u4e2a\u6307\u5411\u5df2\u91ca\u653e\u5185\u5b58\u7684 shared_ptr \u2190 \u60ac\u7a7a\u6307\u9488\uff01\r\n\r\n\/\/ CAS \u7684\u539f\u5b50\u4fdd\u8bc1\uff1a\r\n\/\/ \u5982\u679c lock() \u7684 CAS \u6210\u529f\uff0cuse_count \u5c31\u4ece N \u53d8\u6210\u4e86 N+1\r\n\/\/ \u7ebf\u7a0b2 \u5728\u8fd9\u4e4b\u540e\u6267\u884c use_count--\uff0c\u53ea\u4f1a\u8ba9\u5b83\u53d8\u6210 N\r\n\/\/ \u5bf9\u8c61\u4e0d\u4f1a\u88ab\u9500\u6bc1\uff0c\u56e0\u4e3a use_count \u4ecd\u7136 &gt;= 1<\/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\">make_shared \u5e26\u6765\u7684\u4e00\u4e2a\u9690\u853d\u526f\u4f5c\u7528<\/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\">\/\/ \u7528 new \u5206\u914d\uff1a\u5bf9\u8c61\u5185\u5b58\u548c\u63a7\u5236\u5757\u5185\u5b58\u662f\u5206\u79bb\u7684\r\nstd::shared_ptr&lt;BigObject&gt; sp(new BigObject());\r\n\r\n\/\/ \u5185\u5b58\u5e03\u5c40\uff1a\r\n\/\/ [Control Block] (\u72ec\u7acb\u5206\u914d)\r\n\/\/ [BigObject]     (\u72ec\u7acb\u5206\u914d)\r\n\r\n\/\/ \u5f53 use_count=0 \u65f6\uff1a\r\n\/\/   \u2192 BigObject \u6790\u6784 + BigObject \u5185\u5b58\u7acb\u523b\u91ca\u653e\r\n\/\/   \u2192 \u63a7\u5236\u5757\u7ee7\u7eed\u5b58\u5728\uff08\u7b49 weak_count=0 \u518d\u91ca\u653e\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\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\">\/\/ \u7528 make_shared\uff1a\u5bf9\u8c61\u548c\u63a7\u5236\u5757\u5728\u540c\u4e00\u5757\u5185\u5b58\r\nstd::shared_ptr&lt;BigObject&gt; sp = std::make_shared&lt;BigObject&gt;();\r\n\r\n\/\/ \u5185\u5b58\u5e03\u5c40\uff1a\r\n\/\/ [Control Block | BigObject] (\u4e00\u6b21\u5206\u914d\uff0c\u8fde\u7eed\u5185\u5b58)\r\n\r\n\/\/ \u5f53 use_count=0 \u65f6\uff1a\r\n\/\/   \u2192 BigObject \u6790\u6784\uff08\u6790\u6784\u51fd\u6570\u88ab\u8c03\u7528\uff09\r\n\/\/   \u2192 \u4f46\uff01\u5185\u5b58\u4e0d\u80fd\u91ca\u653e\uff01\u56e0\u4e3a\u63a7\u5236\u5757\u8fd8\u5728\u540c\u4e00\u5757\u5185\u5b58\u91cc\r\n\/\/   \u2192 \u5fc5\u987b\u7b49 weak_count=0\uff0c\u6574\u5757\u5185\u5b58\u624d\u4e00\u8d77\u91ca\u653e\r\n\r\n\/\/ \u7ed3\u8bba\uff1a\u5982\u679c weak_ptr \u7684\u751f\u547d\u5468\u671f\u5f88\u957f\uff0cmake_shared \u53cd\u800c\u4f1a\u8ba9\r\n\/\/        BigObject \u7684\u5185\u5b58\u5728\"\u903b\u8f91\u6b7b\u4ea1\"\u540e\u7ee7\u7eed\u5360\u7528\uff0c\u76f4\u5230\u6700\u540e\u4e00\u4e2a weak_ptr \u6d88\u5931<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5b9e\u9645\u5f71\u54cd\uff1a<\/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\">\/\/ \u573a\u666f\uff1a\u8d44\u6e90\u7ba1\u7406\u5668\u7528 weak_ptr \u505a\u7f13\u5b58\uff0c\u7528 make_shared \u521b\u5efa\u8d44\u6e90\r\nclass ResourceCache {\r\n    std::unordered_map&lt;std::string, std::weak_ptr&lt;Texture&gt;&gt; cache_;\r\n\r\n    std::shared_ptr&lt;Texture&gt; get(const std::string&amp; name) {\r\n        auto&amp; weak = cache_[name];\r\n        if (auto sp = weak.lock()) return sp;\r\n\r\n        \/\/ make_shared\uff1a\u5982\u679c cache_ \u957f\u671f\u6301\u6709 weak_ptr\uff0c\r\n        \/\/ \u5373\u4f7f\u5916\u90e8\u6ca1\u6709\u4eba\u7528\u8fd9\u5f20\u8d34\u56fe\uff08use_count=0\uff09\uff0c\r\n        \/\/ \u8d34\u56fe\u7684\u5185\u5b58\uff08GPU\u6570\u636e\uff09\u4e0d\u4f1a\u88ab\u91ca\u653e\uff0c\u76f4\u5230 cache_ \u6e05\u7406 weak_ptr\r\n        auto tex = std::make_shared&lt;Texture&gt;(name);\r\n        weak = tex;\r\n        return tex;\r\n    }\r\n};\r\n\r\n\/\/ \u5bf9\u5185\u5b58\u654f\u611f\u7684\u573a\u666f\uff0c\u6539\u7528 new \u5206\u914d\uff1a\r\n\/\/ auto tex = std::shared_ptr&lt;Texture&gt;(new Texture(name));\r\n\/\/ \u8fd9\u6837 use_count=0 \u65f6\uff0cTexture \u7684\u5927\u5757 GPU \u6570\u636e\u7acb\u523b\u91ca\u653e\r\n\/\/ \u63a7\u5236\u5757\u53ea\u662f\u51e0\u5341\u5b57\u8282\uff0c\u665a\u4e00\u70b9\u91ca\u653e\u65e0\u6240\u8c13<\/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\u56fe\u603b\u7ed3\u6574\u4e2a\u751f\u547d\u5468\u671f<\/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\">\u521b\u5efa\uff1amake_shared&lt;Player&gt;()\r\n  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n  \u2502  use_count  = 1              \u2502\r\n  \u2502  weak_count = 1              \u2502\r\n  \u2502  [Player data]               \u2502\r\n  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n      \u2191 shared_ptr \u6307\u5411\u8fd9\u91cc\r\n\r\n\u52a0 weak_ptr\uff1a\r\n  use_count  = 1\r\n  weak_count = 2   (\u591a\u4e86\u4e00\u4e2a weak_ptr)\r\n      \u2191 weak_ptr \u4e5f\u6307\u5411\u63a7\u5236\u5757\r\n\r\nshared_ptr \u5168\u90e8\u9500\u6bc1\uff08use_count \u2192 0\uff09\uff1a\r\n  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n  \u2502  use_count  = 0  \u2717           \u2502  Player \u6790\u6784\u51fd\u6570\u88ab\u8c03\u7528\r\n  \u2502  weak_count = 1              \u2502  \u5185\u5b58\u662f\u5426\u91ca\u653e\u53d6\u51b3\u4e8e\u5206\u914d\u65b9\u5f0f\r\n  \u2502  [Player data - \u5df2\u6790\u6784]      \u2502\r\n  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n  \u63a7\u5236\u5757\u8fd8\u6d3b\u7740\uff0cweak_ptr \u53ef\u4ee5\u5b89\u5168\u8bfb use_count\r\n\r\nlock() \u88ab\u8c03\u7528\uff1a\r\n  \u8bfb\u5230 use_count = 0\r\n  \u2192 \u8fd4\u56de\u7a7a shared_ptr\uff08nullptr\uff09\r\n\r\nweak_ptr \u9500\u6bc1\uff08weak_count \u2192 0\uff09\uff1a\r\n  \u6574\u5757\u5185\u5b58\u6700\u7ec8\u91ca\u653e<\/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<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u9762\u8bd5\u91cc\u8fd9\u9053\u9898\u7684\u5b8c\u6574\u56de\u7b54\u5c31\u662f\u8fd9\u4e09\u53e5\u8bdd\u7684\u5c55\u5f00\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]\">weak_ptr<\/code>\u00a0\u6301\u6709\u6307\u5411\u63a7\u5236\u5757\u7684\u6307\u9488\uff0c\u63a7\u5236\u5757\u7684\u751f\u547d\u5468\u671f\u7531\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]\">weak_count<\/code>\u00a0\u63a7\u5236\uff0c\u72ec\u7acb\u4e8e\u5bf9\u8c61\u672c\u8eab\uff1b<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]\">lock()<\/code>\u00a0\u7528\u539f\u5b50 CAS \u68c0\u67e5\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]\">use_count<\/code>\u00a0\u662f\u5426\u4e3a 0 \u5e76\u5c1d\u8bd5\u52a0 1\uff0c\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\u7684\u540c\u65f6\u4e0d\u5b58\u5728 TOCTOU \u7ade\u4e89\uff1b<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]\">use_count == 0<\/code>\u00a0\u5c31\u662f&#8221;\u5bf9\u8c61\u5df2\u88ab\u56de\u6536&#8221;\u7684\u552f\u4e00\u5224\u636e\uff0c\u56e0\u4e3a\u63a7\u5236\u5757\u5728\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]\">weak_ptr<\/code>\u00a0\u5b58\u6d3b\u671f\u95f4\u6c38\u8fdc\u4e0d\u4f1a\u88ab\u91ca\u653e\uff0c\u8bfb\u5b83\u662f\u5b89\u5168\u7684\u3002<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u4e2a\u95ee\u9898\u95ee\u5230\u4e86\u00a0weak_ptr\u00a0\u7684\u6838\u5fc3<\/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-7560","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7560","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=7560"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7560\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}