Parallel.For 多久调用一次 localInit?

2024-01-30

我一直在尝试 Parallel.For。特别是,支持线程本地数据的重载,例如

公共静态 System.Threading.Tasks.ParallelLoopResult For (long fromInclusive, long toExclusive, System.Threading.Tasks.ParallelOptions parallelOptions, Func localInit, Func body, Action localFinally);

根据文档 https://learn.microsoft.com/en-gb/dotnet/api/system.threading.tasks.parallel.for?view=netframework-4.7.2#System_Threading_Tasks_Parallel_For__1_System_Int64_System_Int64_System_Threading_Tasks_ParallelOptions_System_Func___0__System_Func_System_Int64_System_Threading_Tasks_ParallelLoopState___0___0__System_Action___0__

对于参与循环执行的每个线程,都会调用一次 localInit 委托

然而我认为我下面的例子与之相矛盾

var threads = new ConcurrentBag<int>();
ValueTuple LocalInit()
{
    threads.Add(Thread.CurrentThread.ManagedThreadId);
    return new System.ValueTuple();
}
ValueTuple Body(long i, ParallelLoopState _, ValueTuple state) 
{
    Thread.Sleep(100);
    return state;
}
void LocalFinally(ValueTuple state) { };

Parallel.For(0L, 1000L, new ParallelOptions(), LocalInit, Body, LocalFinally);

Console.WriteLine($"{threads.Count} inits between {threads.Distinct().Count()} threads");

它打印一条消息,例如

13 个线程之间有 79 个初始化

这是怎么回事?


尝试记录任务idTask.CurrentId而不是线程 ID。

var threads = new ConcurrentBag<int>();
var tasks = new ConcurrentBag<int>();
ValueTuple LocalInit()
{
    threads.Add(Thread.CurrentThread.ManagedThreadId);
    tasks.Add(Task.CurrentId ?? throw new Exception());
    return new System.ValueTuple();
}
ValueTuple Body(long i, ParallelLoopState _, ValueTuple state) 
{
    Thread.Sleep(100);
    return state;
}
void LocalFinally(ValueTuple state) { };

Parallel.For(0L, 1000L, new ParallelOptions(), LocalInit, Body, LocalFinally);

Console.WriteLine($"{threads.Count} inits between {threads.Distinct().Count()} threads");
Console.WriteLine($"{tasks.Count} inits between {tasks.Distinct().Count()} tasks");

这打印

16 个线程之间有 87 个初始化
87 个任务之间有 87 个初始化

文档是错误的。他们应该说

localInit 委托被调用每个任务一次参与循环的执行

任务数量可以多于线程数量。总是线程数任务数量迭代次数.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Parallel.For 多久调用一次 localInit? 的相关文章

随机推荐

  • Java中相交重叠区间

    我有一组可能重叠的输入日期范围 我不想组合这些重叠的日期范围 而是想创建具有调整日期的新日期范围 例如 应该最终在 Java 有没有有效的方法来解决这个问题 提前致谢 UPDATE 我在第一个问题中没有提到我自己的方法 所以这里是 我只需获
  • PE - 区分数据和函数导出

    我正在尝试找到一种方法来确定 IDA 中哪些导出是数据导出 哪些是实际函数导出 For example let s have a look at Microsoft s msftedit dll s export entries While
  • 多次旋转图像但保持角对齐

    我尝试使用以下代码旋转图像 但我发现生成的图像变得越来越大 Matrix matrix new Matrix matrix setRotate 10 Bitmap newImage Bitmap createBitmap image 0 0
  • 如何在android中的首选项中添加涟漪效应?

    我正在努力在触摸 选择 首选项时添加波纹效果 我通过扩展自定义了我的偏好ListPreference 我尝试通过使用以编程方式设置连锁反应RippleDrawable但我没有看到动画 这是我定制的偏好类别 public class Cust
  • 有时 vim 运行速度明显缓慢

    在某些时候 vim 的运行速度明显很慢 当我在 100 行文件中处于正常模式时 输入 O 大写字母 o 它出现约1 2秒只有在当前行上方才会以插入模式创建新的空行 这是正常行为 我想知道发生这种情况的可能原因 我的电脑很强大 所以问题不在电
  • 按组限制 select2 选择?

    有没有人想出一种方法来限制 select2 按组选择 我希望在选择该组中的某些内容后自动删除该组中的任何选择 实际上限制为每组一个选择 我会做一些事情 如果在我完成之前没有人发布一个好的解决方案 我会将其发布在这里 可以防止在 Select
  • Android.mk 中的 aar 支持

    我现在正在做android定制ROM开发 aosp的构建系统基于Android mk 但是我想包含一些aar库 是否可以在Android mk中包含aar库 您应该将以下块添加到您的 Android mk 中 LOCAL STATIC JA
  • 学说正在将 bigint 作为字符串获取 - 如何防止这种情况

    我有以下问题 Doctrine 应该更新已更改的实体 问题是 由于某种原因 也许是旧版 32 位系统 bigint 数据类型被视为字符串 如下所示 这是学说中的 bigint 类型类 学说代码中还有多种其他到字符串的转换
  • 使用 PHP exec() 运行 Python 脚本

    我想在 php html 文件的按钮按下事件中运行 python 脚本 我尝试跟随 这可以用 PHP exec 实现吗 但以下不起作用 我的代码有什么问题吗 HTML 文件 h3 Run Python Script h3
  • 在 Java 中通过反射设置私有字段的最短、最好、最干净的方法是什么?

    大家好 我已经在 J ava 中使用过 Reflection 了 但是如果您使用 java 标准 例如注入私有字段 您必须编写大量代码才能完成工作 在 Java 对象中注入私有字段的最短方法是什么 广泛使用和生产就绪的库中是否有实现 在不使
  • 主干本地存储:无法读取未定义的属性“延迟”

    我正在尝试使骨干应用程序与本地存储插件一起使用 我在主干库之后添加了该库 我将以下行添加到我的集合中 window ProductCollection Backbone Collection extend model Product loc
  • 从 C# 保存对 Breeze Web api 的更改

    我想创建一个 C 应用程序 它将使用 Breeze Web api 使用相同的 SaveChanges JObject saveBundle 操作将更改集保存到服务器 如何序列化并表示要发送到服务器的变更集 我的主要问题是在将变更集发送到服
  • 每次我单击克隆 html 的链接时,jQuery 都会使我的克隆加倍?

    以下 html 片段包含一个输入 一个选择和一个链接 当我单击链接时 我基本上想要克隆行 我希望将新行附加到最后一行 我还希望删除该链接并将其添加到最后一行 我也想把偶数结转 我将把我的 jquery 代码放在 html 下面 div di
  • 布尔减法 弃用警告

    我最近升级到 numpy 1 9dev 为了改进 OpenBlas 支持 我有一些代码可以x y Where x and y是概率分布的样本 如果分布是伯努利分布 那么它们是布尔值 如果分布是高斯分布 那么它们就是浮点数 取决于所遵循的路径
  • 在COBOL中,是否可以递归调用一个段落?

    在 IBM 大型机的 COBOL 中 是否可以递归调用段落 200 PARAGRAPH SECTION IF WS COUNTER lt 10 ADD 1 TO WS COUNTER PERFORM 200 PARAGRAPH ELSE D
  • numpy 如何使用数组对数组进行切片索引?

    也许这个问题已经在其他地方提出并解决了 但我还没有找到 假设我们有一个 numpy 数组 a np arange 100 reshape 10 10 b np zeros a shape start np array 1 4 7 can b
  • Django 管理命令中添加了虚假换行符

    在 Python 3 5 0 上运行 Django v1 10 from django core management base import BaseCommand class Command BaseCommand def handle
  • Pyspark S3 错误:java.lang.NoClassDefFoundError:com/amazonaws/services/s3/model/MultiObjectDeleteException

    未能成功设置可以读取 AWS s3 文件的 Spark 集群 我使用的软件如下 hadoop aws 3 2 0 jar aws java sdk 1 11 887 jar Spark 3 0 1 bin hadoop3 2 tgz 使用P
  • 如何在 Inno Setup 中使用变量\宏?

    我尝试按以下方式使用宏 变量 但随后出现错误 你能给建议吗 define AnnotateDir C Users new skin Annotate project define AnnotateUserInstallAppData use
  • Parallel.For 多久调用一次 localInit?

    我一直在尝试 Parallel For 特别是 支持线程本地数据的重载 例如 公共静态 System Threading Tasks ParallelLoopResult For long fromInclusive long toExcl