`sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/core-api/refcount-vs-atomicmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/zh_TW/core-api/refcount-vs-atomicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/it_IT/core-api/refcount-vs-atomicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ja_JP/core-api/refcount-vs-atomicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ko_KR/core-api/refcount-vs-atomicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/sp_SP/core-api/refcount-vs-atomicmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhh\/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/refcount-vs-atomic.rsthKubh field_body)}(h.Documentation/core-api/refcount-vs-atomic.rst h]h)}(h-Documentation/core-api/refcount-vs-atomic.rsth]h-Documentation/core-api/refcount-vs-atomic.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h.. _cn_refcount-vs-atomic:h]h}(h]h ]h"]h$]h&]refidcn-refcount-vs-atomicuh1jDhKhhhhhhubhsection)}(hhh](htitle)}(h0与atomic_t相比,refcount_t的API是这样的h]h0与atomic_t相比,refcount_t的API是这样的}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjThhhhhK ubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h)}(hhh]j)}(hhh]h简介}(hjyhhhNhNubah}(h]id9ah ]h"]h$]h&]refidid1uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhjsubah}(h]h ]h"]h$]h&]uh1jqhjnubjr)}(hhh]h)}(hhh]j)}(hhh]h内存顺序的相关类型}(hjhhhNhNubah}(h]id10ah ]h"]h$]h&]refidid2uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjnubjr)}(hhh](h)}(hhh]j)}(hhh]h函数的比较}(hjhhhNhNubah}(h]id11ah ]h"]h$]h&]refidid3uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubjm)}(hhh](jr)}(hhh]h)}(hhh]j)}(hhh]h4情况1) - 非 “读/修改/写”(RMW)操作}(hjhhhNhNubah}(h]id12ah ]h"]h$]h&]refidrmwuh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]h7情况2) - 基于增量的操作,不返回任何值}(hjhhhNhNubah}(h]id13ah ]h"]h$]h&]refidid4uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]h7情况3) - 基于递减的RMW操作,没有返回值}(hj hhhNhNubah}(h]id14ah ]h"]h$]h&]refidid5uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]h7情况4) - 基于增量的RMW操作,返回一个值}(hjBhhhNhNubah}(h]id15ah ]h"]h$]h&]refidid6uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]hE情况 5) - 基于Dec/Sub递减的通用RMW操作,返回一个值}(hjdhhhNhNubah}(h]id16ah ]h"]h$]h&]refid dec-subrmwuh1jhjaubah}(h]h ]h"]h$]h&]uh1hhj^ubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]h:情况6)其他基于递减的RMW操作,返回一个值}(hjhhhNhNubah}(h]id17ah ]h"]h$]h&]refidid7uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(hhh]h)}(hhh]j)}(hhh]h情况7)--基于锁的RMW}(hjhhhNhNubah}(h]id18ah ]h"]h$]h&]refidid8uh1jhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jqhjubeh}(h]h ]h"]h$]h&]uh1jlhjubeh}(h]h ]h"]h$]h&]uh1jqhjnubeh}(h]h ]h"]h$]h&]uh1jlhjihhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1jghhhKhjThhubjS)}(hhh](jX)}(h简介h]h简介}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjhhhhhKubh)}(hXrefcount_t API的目标是为实现对象的引用计数器提供一个最小的API。虽然来自 lib/refcount.c的独立于架构的通用实现在下面使用了原子操作,但一些 ``refcount_*()`` 和 ``atomic_*()`` 函数在内存顺序保证方面有很多不同。本文档概述了这些差异,并 提供了相应的例子,以帮助开发者根据这些内存顺序保证的变化来验证他们的代码。h](hrefcount_t API的目标是为实现对象的引用计数器提供一个最小的API。虽然来自 lib/refcount.c的独立于架构的通用实现在下面使用了原子操作,但一些 }(hjhhhNhNubhliteral)}(h``refcount_*()``h]h refcount_*()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h``atomic_*()``h]h atomic_*()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 函数在内存顺序保证方面有很多不同。本文档概述了这些差异,并 提供了相应的例子,以帮助开发者根据这些内存顺序保证的变化来验证他们的代码。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hq本文档中使用的术语尽量遵循tools/memory-model/Documentation/explanation.txt 中定义的正式LKMM。h]hq本文档中使用的术语尽量遵循tools/memory-model/Documentation/explanation.txt 中定义的正式LKMM。}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hzmemory-barriers.txt和atomic_t.txt提供了更多关于内存顺序的背景,包括通用的 和针对原子操作的。h]hzmemory-barriers.txt和atomic_t.txt提供了更多关于内存顺序的背景,包括通用的 和针对原子操作的。}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]jah ]h"]简介ah$]h&]uh1jRhjThhhhhKubjS)}(hhh](jX)}(h内存顺序的相关类型h]h内存顺序的相关类型}(hjKhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjHhhhhhK ubh)}(h下面的部分只涵盖了本文使用的与原子操作和引用计数器有关的一些内存顺 序类型。如果想了解更广泛的情况,请查阅memory-barriers.txt文件。h]h)}(h下面的部分只涵盖了本文使用的与原子操作和引用计数器有关的一些内存顺 序类型。如果想了解更广泛的情况,请查阅memory-barriers.txt文件。h]h下面的部分只涵盖了本文使用的与原子操作和引用计数器有关的一些内存顺 序类型。如果想了解更广泛的情况,请查阅memory-barriers.txt文件。}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjYubah}(h]h ]h"]h$]h&]uh1hhjHhhhhhNubh)}(hXw在没有任何内存顺序保证的情况下(即完全无序),atomics和refcounters只提供原 子性和程序顺序(program order, po)关系(在同一个CPU上)。它保证每个 ``atomic_* ()`` 和 ``refcount_*()`` 操作都是原子性的,指令在单个CPU上按程序 顺序执行。这是用READ_ONCE()/WRITE_ONCE()和比较并交换原语实现的。h](h在没有任何内存顺序保证的情况下(即完全无序),atomics和refcounters只提供原 子性和程序顺序(program order, po)关系(在同一个CPU上)。它保证每个 }(hjqhhhNhNubj)}(h``atomic_* ()``h]h atomic_* ()}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh 和 }(hjqhhhNhNubj)}(h``refcount_*()``h]h refcount_*()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh 操作都是原子性的,指令在单个CPU上按程序 顺序执行。这是用READ_ONCE()/WRITE_ONCE()和比较并交换原语实现的。}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK%hjHhhubh)}(hX强(完全)内存顺序保证在同一CPU上的所有较早加载和存储的指令(所有程序顺序较早 [po-earlier]指令)在执行任何程序顺序较后指令(po-later)之前完成。它还保证 同一CPU上储存的程序优先较早的指令和来自其他CPU传播的指令必须在该CPU执行任何 程序顺序较后指令之前传播到其他CPU(A-累积属性)。这是用smp_mb()实现的。h]hX强(完全)内存顺序保证在同一CPU上的所有较早加载和存储的指令(所有程序顺序较早 [po-earlier]指令)在执行任何程序顺序较后指令(po-later)之前完成。它还保证 同一CPU上储存的程序优先较早的指令和来自其他CPU传播的指令必须在该CPU执行任何 程序顺序较后指令之前传播到其他CPU(A-累积属性)。这是用smp_mb()实现的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjHhhubh)}(hXjRELEASE内存顺序保证了在同一CPU上所有较早加载和存储的指令(所有程序顺序较早 指令)在此操作前完成。它还保证同一CPU上储存的程序优先较早的指令和来自其他CPU 传播的指令必须在释放(release)操作之前传播到所有其他CPU(A-累积属性)。这是用 smp_store_release()实现的。h]hXjRELEASE内存顺序保证了在同一CPU上所有较早加载和存储的指令(所有程序顺序较早 指令)在此操作前完成。它还保证同一CPU上储存的程序优先较早的指令和来自其他CPU 传播的指令必须在释放(release)操作之前传播到所有其他CPU(A-累积属性)。这是用 smp_store_release()实现的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjHhhubh)}(hXKACQUIRE内存顺序保证了同一CPU上的所有后加载和存储的指令(所有程序顺序较后 指令)在获取(acquire)操作之后完成。它还保证在获取操作执行后,同一CPU上 储存的所有程序顺序较后指令必须传播到所有其他CPU。这是用 smp_acquire__after_ctrl_dep()实现的。h]hXKACQUIRE内存顺序保证了同一CPU上的所有后加载和存储的指令(所有程序顺序较后 指令)在获取(acquire)操作之后完成。它还保证在获取操作执行后,同一CPU上 储存的所有程序顺序较后指令必须传播到所有其他CPU。这是用 smp_acquire__after_ctrl_dep()实现的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjHhhubh)}(hX对Refcounters的控制依赖(取决于成功)保证了如果一个对象的引用被成功获得(引用计数 器的增量或增加行为发生了,函数返回true),那么进一步的存储是针对这个操作的命令。对存 储的控制依赖没有使用任何明确的屏障来实现,而是依赖于CPU不对存储进行猜测。这只是 一个单一的CPU关系,对其他CPU不提供任何保证。h]hX对Refcounters的控制依赖(取决于成功)保证了如果一个对象的引用被成功获得(引用计数 器的增量或增加行为发生了,函数返回true),那么进一步的存储是针对这个操作的命令。对存 储的控制依赖没有使用任何明确的屏障来实现,而是依赖于CPU不对存储进行猜测。这只是 一个单一的CPU关系,对其他CPU不提供任何保证。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjHhhubeh}(h]jah ]h"]内存顺序的相关类型ah$]h&]uh1jRhjThhhhhK ubjS)}(hhh](jX)}(h函数的比较h]h函数的比较}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjhhhhhK@ubjS)}(hhh](jX)}(h4情况1) - 非 “读/修改/写”(RMW)操作h]h4情况1) - 非 “读/修改/写”(RMW)操作}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjhhhhhKCubh)}(h 函数变化:h]h 函数变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjhhubh block_quote)}(hF* atomic_set() --> refcount_set() * atomic_read() --> refcount_read() h]jm)}(hhh](jr)}(hatomic_set() --> refcount_set()h]h)}(hjh]hatomic_set() --> refcount_set()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(h"atomic_read() --> refcount_read() h]h)}(h!atomic_read() --> refcount_read()h]h!atomic_read() --> refcount_read()}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhj2ubah}(h]h ]h"]h$]h&]uh1jqhjubeh}(h]h ]h"]h$]h&]bullet*uh1jlhhhKGhjubah}(h]h ]h"]h$]h&]uh1jhhhKGhjhhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjhhubj)}(h&* none (两者都是完全无序的) h]jm)}(hhh]jr)}(h$none (两者都是完全无序的) h]h)}(h"none (两者都是完全无序的)h]h"none (两者都是完全无序的)}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjmubah}(h]h ]h"]h$]h&]uh1jqhjjubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKLhjfubah}(h]h ]h"]h$]h&]uh1jhhhKLhjhhubeh}(h]jah ]h"]4情况1) - 非 “读/修改/写”(rmw)操作ah$]h&]uh1jRhjhhhhhKCubjS)}(hhh](jX)}(h7情况2) - 基于增量的操作,不返回任何值h]h7情况2) - 基于增量的操作,不返回任何值}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjhhhhhKPubh)}(h 函数变化:h]h 函数变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjhhubj)}(hD* atomic_inc() --> refcount_inc() * atomic_add() --> refcount_add() h]jm)}(hhh](jr)}(hatomic_inc() --> refcount_inc()h]h)}(hjh]hatomic_inc() --> refcount_inc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(h atomic_add() --> refcount_add() h]h)}(hatomic_add() --> refcount_add()h]hatomic_add() --> refcount_add()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjubah}(h]h ]h"]h$]h&]uh1jqhjubeh}(h]h ]h"]h$]h&]jPjQuh1jlhhhKThjubah}(h]h ]h"]h$]h&]uh1jhhhKThjhhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjhhubj)}(h%* none (两者都是完全无序的) h]jm)}(hhh]jr)}(h#none (两者都是完全无序的) h]h)}(h"none (两者都是完全无序的)h]h"none (两者都是完全无序的)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjubah}(h]h ]h"]h$]h&]uh1jqhj ubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKYhjubah}(h]h ]h"]h$]h&]uh1jhhhKYhjhhubeh}(h]j ah ]h"]7情况2) - 基于增量的操作,不返回任何值ah$]h&]uh1jRhjhhhhhKPubjS)}(hhh](jX)}(h7情况3) - 基于递减的RMW操作,没有返回值h]h7情况3) - 基于递减的RMW操作,没有返回值}(hj<hhhNhNubah}(h]h ]h"]h$]h&]jPj)uh1jWhj9hhhhhK\ubh)}(h 函数变化:h]h 函数变化:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hj9hhubj)}(h"* atomic_dec() --> refcount_dec() h]jm)}(hhh]jr)}(h atomic_dec() --> refcount_dec() h]h)}(hatomic_dec() --> refcount_dec()h]hatomic_dec() --> refcount_dec()}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hj_ubah}(h]h ]h"]h$]h&]uh1jqhj\ubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhK`hjXubah}(h]h ]h"]h$]h&]uh1jhhhK`hj9hhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj9hhubj)}(h%* 完全无序的 --> RELEASE顺序 h]jm)}(hhh]jr)}(h#完全无序的 --> RELEASE顺序 h]h)}(h!完全无序的 --> RELEASE顺序h]h!完全无序的 --> RELEASE顺序}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1jqhjubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKdhjubah}(h]h ]h"]h$]h&]uh1jhhhKdhj9hhubeh}(h]j/ah ]h"]7情况3) - 基于递减的rmw操作,没有返回值ah$]h&]uh1jRhjhhhhhK\ubjS)}(hhh](jX)}(h7情况4) - 基于增量的RMW操作,返回一个值h]h7情况4) - 基于增量的RMW操作,返回一个值}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjKuh1jWhjhhhhhKhubh)}(h 函数变化:h]h 函数变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjhhubj)}(hk* atomic_inc_not_zero() --> refcount_inc_not_zero() * 无原子性对应函数 --> refcount_add_not_zero() h]jm)}(hhh](jr)}(h1atomic_inc_not_zero() --> refcount_inc_not_zero()h]h)}(hjh]h1atomic_inc_not_zero() --> refcount_inc_not_zero()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(h5无原子性对应函数 --> refcount_add_not_zero() h]h)}(h4无原子性对应函数 --> refcount_add_not_zero()h]h4无原子性对应函数 --> refcount_add_not_zero()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKmhjubah}(h]h ]h"]h$]h&]uh1jqhjubeh}(h]h ]h"]h$]h&]jPjQuh1jlhhhKlhjubah}(h]h ]h"]h$]h&]uh1jhhhKlhjhhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjhhubj)}(h5* 完全有序的 --> 控制依赖于存储的成功 h]jm)}(hhh]jr)}(h3完全有序的 --> 控制依赖于存储的成功 h]h)}(h2完全有序的 --> 控制依赖于存储的成功h]h2完全有序的 --> 控制依赖于存储的成功}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhj9ubah}(h]h ]h"]h$]h&]uh1jqhj6ubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKqhj2ubah}(h]h ]h"]h$]h&]uh1jhhhKqhjhhubh)}(hZ此处 **假设** 了,必要的顺序是作为获得对象指针的结果而提供的。h]h)}(hj_h](h此处 }(hjahhhNhNubhstrong)}(h **假设**h]h假设}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhjaubhI 了,必要的顺序是作为获得对象指针的结果而提供的。}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKshj]ubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubeh}(h]jQah ]h"]7情况4) - 基于增量的rmw操作,返回一个值ah$]h&]uh1jRhjhhhhhKhubjS)}(hhh](jX)}(hE情况 5) - 基于Dec/Sub递减的通用RMW操作,返回一个值h]hE情况 5) - 基于Dec/Sub递减的通用RMW操作,返回一个值}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjmuh1jWhjhhhhhKwubh)}(h 函数变化:h]h 函数变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjhhubj)}(hh* atomic_dec_and_test() --> refcount_dec_and_test() * atomic_sub_and_test() --> refcount_sub_and_test() h]jm)}(hhh](jr)}(h1atomic_dec_and_test() --> refcount_dec_and_test()h]h)}(hjh]h1atomic_dec_and_test() --> refcount_dec_and_test()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjubah}(h]h ]h"]h$]h&]uh1jqhjubjr)}(h2atomic_sub_and_test() --> refcount_sub_and_test() h]h)}(h1atomic_sub_and_test() --> refcount_sub_and_test()h]h1atomic_sub_and_test() --> refcount_sub_and_test()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjubah}(h]h ]h"]h$]h&]uh1jqhjubeh}(h]h ]h"]h$]h&]jPjQuh1jlhhhK{hjubah}(h]h ]h"]h$]h&]uh1jhhhK{hjhhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjhhubj)}(h>* 完全有序的 --> RELEASE顺序 + 成功后ACQUIRE顺序 h]jm)}(hhh]jr)}(h<完全有序的 --> RELEASE顺序 + 成功后ACQUIRE顺序 h]h)}(h:完全有序的 --> RELEASE顺序 + 成功后ACQUIRE顺序h]h:完全有序的 --> RELEASE顺序 + 成功后ACQUIRE顺序}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jqhjubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]jsah ]h"]E情况 5) - 基于dec/sub递减的通用rmw操作,返回一个值ah$]h&]uh1jRhjhhhhhKwubjS)}(hhh](jX)}(h:情况6)其他基于递减的RMW操作,返回一个值h]h:情况6)其他基于递减的RMW操作,返回一个值}(hj3hhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhj0hhhhhKubh)}(h 函数变化:h]h 函数变化:}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0hhubj)}(h}* 无原子性对应函数 --> refcount_dec_if_one() * ``atomic_add_unless(&var, -1, 1)`` --> ``refcount_dec_not_one(&var)`` h]jm)}(hhh](jr)}(h2无原子性对应函数 --> refcount_dec_if_one()h]h)}(hjXh]h2无原子性对应函数 --> refcount_dec_if_one()}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjVubah}(h]h ]h"]h$]h&]uh1jqhjSubjr)}(hF``atomic_add_unless(&var, -1, 1)`` --> ``refcount_dec_not_one(&var)`` h]h)}(hE``atomic_add_unless(&var, -1, 1)`` --> ``refcount_dec_not_one(&var)``h](j)}(h"``atomic_add_unless(&var, -1, 1)``h]hatomic_add_unless(&var, -1, 1)}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh --> }(hjqhhhNhNubj)}(h``refcount_dec_not_one(&var)``h]hrefcount_dec_not_one(&var)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1hhhhKhjmubah}(h]h ]h"]h$]h&]uh1jqhjSubeh}(h]h ]h"]h$]h&]jPjQuh1jlhhhKhjOubah}(h]h ]h"]h$]h&]uh1jhhhKhj0hhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0hhubj)}(h3* 完全有序的 --> RELEASE顺序 + 控制依赖 h]jm)}(hhh]jr)}(h1完全有序的 --> RELEASE顺序 + 控制依赖 h]h)}(h0完全有序的 --> RELEASE顺序 + 控制依赖h]h0完全有序的 --> RELEASE顺序 + 控制依赖}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jqhjubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhj0hhubh)}(h@atomic_add_unless()只在执行成功时提供完整的顺序。h]h)}(hjh]h@atomic_add_unless()只在执行成功时提供完整的顺序。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj0hhhhhNubeh}(h]jah ]h"]:情况6)其他基于递减的rmw操作,返回一个值ah$]h&]uh1jRhjhhhhhKubjS)}(hhh](jX)}(h情况7)--基于锁的RMWh]h情况7)--基于锁的RMW}(hjhhhNhNubah}(h]h ]h"]h$]h&]jPjuh1jWhjhhhhhKubh)}(h 函数变化:h]h 函数变化:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(ht* atomic_dec_and_lock() --> refcount_dec_and_lock() * atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock() h]jm)}(hhh](jr)}(h1atomic_dec_and_lock() --> refcount_dec_and_lock()h]h)}(hj,h]h1atomic_dec_and_lock() --> refcount_dec_and_lock()}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj*ubah}(h]h ]h"]h$]h&]uh1jqhj'ubjr)}(h>atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock() h]h)}(h=atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock()h]h=atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock()}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAubah}(h]h ]h"]h$]h&]uh1jqhj'ubeh}(h]h ]h"]h$]h&]jPjQuh1jlhhhKhj#ubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubh)}(h内存顺序保证变化:h]h内存顺序保证变化:}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h8* 完全有序 --> RELEASE顺序 + 控制依赖 + 持有h]jm)}(hhh]jr)}(h6完全有序 --> RELEASE顺序 + 控制依赖 + 持有h]h)}(hj|h]h6完全有序 --> RELEASE顺序 + 控制依赖 + 持有}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzubah}(h]h ]h"]h$]h&]uh1jqhjwubah}(h]h ]h"]h$]h&]jPjQuh1jlhhhKhjsubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]jah ]h"]情况7)--基于锁的rmwah$]h&]uh1jRhjhhhhhKubeh}(h]jah ]h"]函数的比较ah$]h&]uh1jRhjThhhhhK@ubeh}(h](atomic-t-refcount-tapijQeh ]h"](0与atomic_t相比,refcount_t的api是这样的cn_refcount-vs-atomiceh$]h&]uh1jRhhhhhhhK expect_referenced_by_name}jjFsexpect_referenced_by_id}jQjFsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jWN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}jQ]jFasnameids}(jjQjjjjjEjjjjjjjj6j jj/jjQj-jsjjjju nametypes}(jjjjEjjjj6jjj-jjuh}(jQjTjjTjjijjjjHjjjjj jj/j9jQjjsjjj0jjjjyjjjjjjjjj)j jKjBjmjdjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h;Hyperlink target "cn-refcount-vs-atomic" is not referenced.}hjE sbah}(h]h ]h"]h$]h&]uh1hhjB ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourceh،lineKuh1j@ uba transformerN include_log]@Documentation/translations/zh_CN/core-api/refcount-vs-atomic.rst(NNNNta decorationNhhub.