【发布时间】:2021-06-19 03:20:02
【问题描述】:
我想同时对Span<T> 进行操作,但这样的事情是不合法的:
void DoSomething(Span<int> buffer, int option1, int option2)
{
.......
}
void ParallelDoSomething(Span<int> buffer)
{
var size = buffer.Length;
Parallel.Invoke(() => DoSomething(buffer, 0, size / 2),
() => DoSomething(buffer, size/2, size)); //not legal
}
因为编译器抱怨:不能在匿名方法、lambda 表达式、查询表达式或本地函数中使用 ref、out 或 in 参数“缓冲区”
如何在以Span<T> 作为参数的并行方法中执行?
【问题讨论】:
-
作为旁注:我想知道
option1/option2是否应该从DoSomething()中删除;这看起来像是应该通过切片应用的东西;附带说明一下,这样做可以提高性能:for(int i = 0 ; i < span.Length; i++)和foreach(var val in span)具有 JIT 优化(边界检查省略),但for (int i = option1; i < option2; i++)没有 -
并行化
ParallelDoSomething的调用者怎么样 -
@Mark Gravell,当然 option1/ option2 在这里无关紧要。我只是想快速更改 Mergesort 实现以使用堆栈分配 Spans 而不是数组,因为 MemoryExtensions.Sort 对我没有帮助。
-
@Charlieface,调用者没有什么可以并行化的。