簡體   English   中英

Haskell:“atomicModifyIORef”是如何工作的?

[英]Haskell: How does 'atomicModifyIORef' work?

有人可以解釋atomicModifyIORef是如何工作的嗎? 特別是:

(1) 它是等待鎖定,還是樂觀地嘗試並在存在爭用時重試(如TVar )。
(2) 為什么 atomicModifyIORef 的簽名與atomicModifyIORef的簽名modifyIORef 特別是,這個額外的變量b是什么?

編輯:我想我已經找到了 (2) 的答案,因為b是要提取的值(如果不需要,它可以為空)。 在單線程程序中,知道該值是微不足道的,但在多線程程序中,人們可能想知道在應用 function 時的先前值是什么。 我認為這就是為什么modifyIORef沒有這個額外的返回值(因為帶有這個返回值的modifyIORef的用法可能無論如何都應該使用atomicModifyIORef 。不過我仍然對(1)的答案感興趣。

它是等待鎖定,還是樂觀地嘗試並在存在爭用時重試(如 TVar)。

atomicModifyIORef 在您所在的底層硬件架構上使用鎖定指令,以原子方式將指針交換到分配的 Haskell object。

在 x86 上,它使用 cas 指令,通過atomicModifyMutVar#作為語言的原語公開,它在 Cmm 中作為運行時服務實現為:

stg_atomicModifyMutVarzh
{
...

 retry:
   x = StgMutVar_var(mv);
   StgThunk_payload(z,1) = x;
#ifdef THREADED_RTS
   (h) = foreign "C" cas(mv + SIZEOF_StgHeader + OFFSET_StgMutVar_var, x, y) [];
   if (h != x) { goto retry; }
#else
   StgMutVar_var(mv) = y;
#endif
...
}

也就是說,它將嘗試進行交換,否則重試。

cas 作為原語的實現展示了我們如何深入研究金屬:

/*
 * Compare-and-swap.  Atomically does this:
 */
EXTERN_INLINE StgWord cas(StgVolatilePtr p, StgWord o, StgWord n);

/*
 * CMPXCHG - the single-word atomic compare-and-exchange instruction.  Used
 * in the STM implementation.
 */
EXTERN_INLINE StgWord
cas(StgVolatilePtr p, StgWord o, StgWord n)
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
    __asm__ __volatile__ (
      "lock\ncmpxchg %3,%1"
          :"=a"(o), "=m" (*(volatile unsigned int *)p)
          :"0" (o), "r" (n));
    return o;
#elif arm_HOST_ARCH && defined(arm_HOST_ARCH_PRE_ARMv6)
    StgWord r;
    arm_atomic_spin_lock();
    r  = *p;
    if (r == o) { *p = n; }
    arm_atomic_spin_unlock();
    return r;
#elif !defined(WITHSMP)
    StgWord result;
    result = *p;
    if (result == o) {
        *p = n;
    }
    return result;

所以你可以看到它能夠在 Intel 中使用原子指令,在其他架構上將使用不同的機制。 運行時將重試。

atomicModifyIORef采用r:: IORef a和 function f:: a -> (a, b)並執行以下操作:

它讀取r的值並將f應用於該值,產生(a',b) 然后用新值a'更新r ,而b是返回值。 這種讀寫訪問是自動完成的。

當然,只有通過atomicModifyIORef完成對r所有訪問時,這種原子性才有效。 請注意,您可以通過查看來源 [1] 找到此信息。

[1] https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-IORef.html#v:atomicModifyIORef

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM