Interlocked.Exchange可以交换两个byte []数组吗?

时间:2011-05-06 23:56:26

标签: c# arrays interlocked

我想原子地交换两个字节数组,而不需要 锁。即我想要

    byte[] src;
    byte[] dest;
    lock(synchLock)
    {

       dest = src;
    }

Interlocked.Exchange可以实现吗?我认为它适用于docs中的int数组。

谢谢!

3 个答案:

答案 0 :(得分:3)

交换数组引用还是交换它们的元素?参考文献 - 是的,元素 - 没有。没有适用于数组的原子命令。

答案 1 :(得分:1)

是的,Interlocked.Exchange支持所有引用类型和一些选定的值类型(Int32 / 64 / Ptr,Single,Double)。

答案 2 :(得分:1)

目前尚不清楚你在问什么,但InterlockedExchange原子地做了以下事情:

  1. 读取变量的预先存在的值
  2. 写入变量
  3. 请注意,操作中只涉及一个变量,以及两个临时值(正在写入的值,以及返回的先前值)。而“交换”通常意味着写两个变量,这样每个变量都具有预先存在于另一个变量中的值。那将是:

    byte[] src;
    byte[] dest;
    lock(synchLock)
    {
       var temp = dest;
       dest = src;
       src = temp;
    }
    

    InterlockedExchange不能用于对两个变量实现具有原子效应的无锁交换。