<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Fetch-and-add</id>
	<title>Fetch-and-add - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Fetch-and-add"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Fetch-and-add&amp;action=history"/>
	<updated>2026-07-16T17:54:40Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Fetch-and-add&amp;diff=2976572&amp;oldid=prev</id>
		<title>imported&gt;Jimmy-bot：​机器人: 尚未清空的已重定向分类（Cat:協同控制→Cat:并发控制）</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Fetch-and-add&amp;diff=2976572&amp;oldid=prev"/>
		<updated>2023-12-05T02:21:41Z</updated>

		<summary type="html">&lt;p&gt;机器人: 尚未清空的已重定向分类（&lt;a href=&quot;/index.php?title=Cat:%E5%8D%94%E5%90%8C%E6%8E%A7%E5%88%B6&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Cat:協同控制（页面不存在）&quot;&gt;Cat:協同控制&lt;/a&gt;→&lt;a href=&quot;/index.php?title=Cat:%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Cat:并发控制（页面不存在）&quot;&gt;Cat:并发控制&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;fetch-and-add&amp;#039;&amp;#039;&amp;#039;是[[CPU]]指令（FAA），对内存位置执行增加一个数量的原子操作。具体内容为：&lt;br /&gt;
:令{{mvar|x}} 变为{{math|&amp;#039;&amp;#039;x&amp;#039;&amp;#039; + &amp;#039;&amp;#039;a&amp;#039;&amp;#039;}}，其中{{mvar|x}}是个内存位置，{{mvar|a}}是个值&lt;br /&gt;
&lt;br /&gt;
FAA可用于实现[[互斥锁]]、[[信号量]]。&lt;br /&gt;
&lt;br /&gt;
1991年，{{tsl|en|Maurice Herlihy}}证明fetch-and-add具有一个有限的{{tsl|en|Consensus (computer science)|consensus (计算机科学)|consensus}}数，能解决不超过两个并发进程的无等待consensus问题。&amp;lt;ref&amp;gt;{{cite journal |last=Herlihy |first=Maurice |title=Wait-free synchronization |journal=ACM Trans. Program. Lang. Syst. |volume=13 |issue=1 |date=January 1991 |pages=124–149 |url=http://www.cs.brown.edu/~mph/Herlihy91/p124-herlihy.pdf |accessdate=2007-05-20 |doi=10.1145/114005.102808 |archive-date=2011-06-05 |archive-url=https://web.archive.org/web/20110605003208/http://www.cs.brown.edu/~mph/Herlihy91/p124-herlihy.pdf |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==用途==&lt;br /&gt;
下述伪代码用[[ticket lock]]算法实现了互斥锁：&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;record&amp;#039;&amp;#039;&amp;#039; locktype {&lt;br /&gt;
     &amp;#039;&amp;#039;int&amp;#039;&amp;#039; ticketnumber&lt;br /&gt;
     &amp;#039;&amp;#039;int&amp;#039;&amp;#039; turn&lt;br /&gt;
  }&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;procedure&amp;#039;&amp;#039;&amp;#039; LockInit( &amp;#039;&amp;#039;locktype&amp;#039;&amp;#039;* lock ) {&lt;br /&gt;
     lock.ticketnumber := 0&lt;br /&gt;
     lock.turn := 0&lt;br /&gt;
  }&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;procedure&amp;#039;&amp;#039;&amp;#039; Lock( &amp;#039;&amp;#039;locktype&amp;#039;&amp;#039;* lock ) {&lt;br /&gt;
     &amp;#039;&amp;#039;int&amp;#039;&amp;#039; myturn := FetchAndIncrement( &amp;amp;lock.ticketnumber ) //must be atomic, since many threads might ask for a lock at the same time&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; lock.turn ≠ myturn &lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;skip&amp;#039;&amp;#039;&amp;#039; // &amp;#039;&amp;#039;spin until lock is acquired&amp;#039;&amp;#039;&lt;br /&gt;
  }&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;procedure&amp;#039;&amp;#039;&amp;#039; UnLock( &amp;#039;&amp;#039;locktype&amp;#039;&amp;#039;* lock ) {&lt;br /&gt;
     FetchAndIncrement( &amp;amp;lock.turn ) //this need not be atomic, since only the possessor of the lock will execute this&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==硬件软件支持==&lt;br /&gt;
[[C++11]]标准定义了原子的{{mono|fetch_add}}函数。&amp;lt;ref&amp;gt;{{cite web |title=std::atomic::fetch_add |website=cppreference.com |url=http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add |accessdate=1 June 2015 |archive-date=2017-11-23 |archive-url=https://web.archive.org/web/20171123082739/http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add |dead-url=no }}&amp;lt;/ref&amp;gt; GCC把它作为对C语言的扩展。&amp;lt;ref&amp;gt;{{cite web |title=Atomic Builtins |website=Using the GNU Compiler Collection (GCC) |publisher=Free Software Foundation |year=2005 |url=https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html |accessdate=2017-11-22 |archive-date=2017-11-08 |archive-url=https://web.archive.org/web/20171108015543/http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===x86实现===&lt;br /&gt;
从[[8086]]起，以内存为目的操作数的ADD指令就是fetch-and-add。如果使用LOCK前缀，那么它对多处理器是原子操作。但不能返回原值，直至[[80486|486]]引入XADD指令。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    void __fastcall atomic_inc (volatile int* pNum)&lt;br /&gt;
    {&lt;br /&gt;
        __asm&lt;br /&gt;
        {&lt;br /&gt;
            lock inc dword ptr [ECX]&lt;br /&gt;
            ret&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下述GCC编译的[[C语言]]函数，在x86的32位与64位平台上，使用扩展asm语法：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  static inline int fetch_and_add(int* variable, int value)&lt;br /&gt;
  {&lt;br /&gt;
      __asm__ volatile(&amp;quot;lock; xaddl %0, %1&amp;quot;&lt;br /&gt;
        : &amp;quot;+r&amp;quot; (value), &amp;quot;+m&amp;quot; (*variable) // input+output&lt;br /&gt;
        : // No input-only&lt;br /&gt;
        : &amp;quot;memory&amp;quot;&lt;br /&gt;
      );&lt;br /&gt;
      return value;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==参见==&lt;br /&gt;
*[[Test-and-set]]&lt;br /&gt;
*[[Test and Test-and-set]]&lt;br /&gt;
*[[Compare-and-swap]]&lt;br /&gt;
*[[Load-Link/Store-Conditional]]&lt;br /&gt;
&lt;br /&gt;
==参考文献==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:并发控制]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Jimmy-bot</name></author>
	</entry>
</feed>