我想原子地交换两个字节数组,而不需要 锁。即我不想要
byte[] src;
byte[] dest;
lock(synchLock)
{
dest = src;
}
Interlocked.Exchange可以实现吗?我认为它适用于docs中的int数组。
谢谢!
答案 0 :(得分:3)
交换数组引用还是交换它们的元素?参考文献 - 是的,元素 - 没有。没有适用于数组的原子命令。
答案 1 :(得分:1)
是的,Interlocked.Exchange
支持所有引用类型和一些选定的值类型(Int32 / 64 / Ptr,Single,Double)。
答案 2 :(得分:1)
目前尚不清楚你在问什么,但InterlockedExchange
原子地做了以下事情:
请注意,操作中只涉及一个变量,以及两个临时值(正在写入的值,以及返回的先前值)。而“交换”通常意味着写两个变量,这样每个变量都具有预先存在于另一个变量中的值。那将是:
byte[] src;
byte[] dest;
lock(synchLock)
{
var temp = dest;
dest = src;
src = temp;
}
InterlockedExchange
不能用于对两个变量实现具有原子效应的无锁交换。