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)
我的目标是写buffer1
在Thread1
,抢互斥,开关周围的指针和重复这个过程.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)
理解数组始终是引用类型只是一个问题.
该Array
CLAS是引用类型,所以没有副本,仅供参考分配.使用该Array.CopyTo
方法将一个数组的内容复制到另一个数组.
这种行为是有区别的C++
,您可以在其中覆盖=
运算符.在.NET
,你不能覆盖它,并且没有办法在分配时复制某些集合的内容.
另外,reference assign
您要做的是原子操作,因此您可以考虑lock-free
在代码中使用该算法来处理这部分代码.
归档时间: |
|
查看次数: |
14457 次 |
最近记录: |