C#:将数组分配给另一个数组:复制还是指针交换?

Jar*_*316 9 c# arrays multithreading

很抱歉提出这个问题,我一直在谷歌搜索,但似乎出现的是克隆或复制方法的引用,而不是我的问题的实际答案C#.

我有两个字节数组,它们由两个线程访问.

private byte[] buffer1 = new byte[size];
private byte[] buffer2 = new byte[size];
Run Code Online (Sandbox Code Playgroud)

我的目标是写buffer1Thread1,抢互斥,开关周围的指针和重复这个过程.Thread2会抓住互斥量并且总是阅读buffer2.

目标是Thread2快速运行并且不受发生的复制的影响Thread1.

我不清楚当我执行以下操作时会发生什么:

byte[] temp = buffer1;
buffer1 = buffer2;
buffer2 = temp;
Run Code Online (Sandbox Code Playgroud)

是指针被切换还是buffer2被复制的内容buffer1?这应该是一个简单的问题,但我似乎无法找到解决方案.Thread1正在做一个Marshal.Copy(),我不希望这个电话有影响力Thread2.

Jon*_*eet 19

赋值总是只将一个表达式的值复制到变量中(或调用属性/索引器设置器).

在你的情况下,用这个:

buffer1 = buffer2;
Run Code Online (Sandbox Code Playgroud)

...的值buffer2只是对字节数组的引用.因此在该赋值之后(并且假设没有其他赋值),对"字节数组"进行了更改"通过"一个变量将"通过"另一个变量可见.

这不是特定于数组类型 - 这是引用类型在整个.NET中的工作方式:

StringBuilder x = new StringBuilder();
StringBuilder y = x;
x.Append("Foo");
Console.WriteLine(y); // Foo
Run Code Online (Sandbox Code Playgroud)

理解数组始终是引用类型只是一个问题.


VMA*_*Atm 9

ArrayCLAS是引用类型,所以没有副本,仅供参考分配.使用该Array.CopyTo方法将一个数组的内容复制到另一个数组.

这种行为是有区别的C++,您可以在其中覆盖=运算符.在.NET,你不能覆盖它,并且没有办法在分配时复制某些集合的内容.

另外,reference assign您要做的是原子操作,因此您可以考虑lock-free在代码中使用该算法来处理这部分代码.