C# Task.Run:计算出的闭包变量对执行 lambda 表达式的线程是否可见?

C# Task.Run: Are calculated closure variables visible to the thread where the lambda expression is executed?

提问人:bebo 提问时间:9/23/2020 更新时间:9/23/2020 访问量:210

问:

在使用 lambda 表达式在 Task 中使用值之前,对值进行计算机处理是否安全。 在任务中,“param”是从不同的线程使用的。当任务在计算后立即启动时,闭包变量“param”在任务线程上可见吗? 还是有必要锁定对“param”的访问? 参数计算完成后,从此时起应将其视为只读。

不带锁:

int param = a + b; // param shall be considered immutable after it was calculated
Task.Run(() => MethodWithParameter(param));

带锁:

int param;
lock(obj) param = a + b; // param shall be considered immutable after it was calculated
Task.Run(() => {
    int p2;
    lock(obj) p2 = param
    MethodWithParameter(p2)); 
}
C# 线程安全 闭包 任务

评论


答:

-1赞 Theodor Zoulias 9/23/2020 #1

是的,TPL 在任务排队时和任务执行的开始/结束时包含适当的内存屏障,以便对其他线程适当地显示值。

来源:

  1. 你在那里,异步写入值吗?
  2. 内存屏障发生器