我想以原子方式交换两个字节数组,而无需一把锁。即我不想做
byte[] src;
byte[] dest;
lock(synchLock)
{
dest = src;
}
这可以通过互锁交换吗?我看到它适用于文档中的 int 数组。
谢谢!
交换数组引用还是交换它们的元素?参考文献 - 是的,元素 - 否。没有适用于数组的原子命令。
不清楚你在问什么,但InterlockedExchange
原子地执行以下操作:
- 读取变量的预先存在的值
- 写入变量
请注意,操作中仅涉及一个变量,以及两个临时变量(正在写入的值和返回的前一个值)。 而"交换"通常意味着编写两个变量,使得每个变量都具有另一个变量中预先存在的值。 那将是:
byte[] src;
byte[] dest;
lock(synchLock)
{
var temp = dest;
dest = src;
src = temp;
}
InterlockedExchange
不能用于实现对两个变量都具有原子效应的无锁交换。
,Interlocked.Exchange
支持所有引用类型和一些选定的值类型(Int32/64/Ptr、单、双)。