2

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

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

       dest = src;
    }

这可能与 Interlocked.Exchange 吗?我看到它适用于文档中的 int 数组。

谢谢!

4

3 回答 3

3

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

于 2011-05-07T00:00:36.810 回答
1

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

于 2011-05-07T00:06:33.130 回答
1

目前尚不清楚您在问什么,但InterlockedExchange原子地执行以下操作:

  1. 读取变量的预先存在的值
  2. 写入变量

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

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

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

于 2011-05-07T00:48:58.387 回答