1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00
This commit is contained in:
larkliy 2025-06-02 23:28:04 +02:00 committed by GitHub
commit c50d68f2b3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,49 @@
namespace System.Threading.Tasks;
public class Parallel
{
#if BF_PLATFORM_WINDOWS
public static void ForEach<T>(Span<T> source, delegate void(T item) body, int maxDegreeOfParallelism = -1) {
int count = source.Length;
if (count == 0)
return;
var processorCount = OperatingSystem.[Friend]GetSystemInfo(.. scope .()).dwNumberOfProcessors;
int degree = maxDegreeOfParallelism == -1 ? processorCount : maxDegreeOfParallelism;
if (degree <= 0)
degree = 1;
degree = Math.Min(degree, count);
if (degree == 1)
{
for (var item in source)
body(item);
return;
}
Task[] tasks = new Task[degree];
defer delete tasks;
int workItemIndex = -1;
for (var i < degree)
{
tasks[i] = new Task(new [&]() => {
int index;
while ((index = Interlocked.Increment(ref workItemIndex)) < count)
body(source[index]);
});
tasks[i].Start();
}
for (var i < degree) {
tasks[i].Wait();
delete tasks[i];
}
}
#endif
}