提问人:bebo 提问时间:9/23/2020 更新时间:9/23/2020 访问量:210
C# Task.Run:计算出的闭包变量对执行 lambda 表达式的线程是否可见?
C# Task.Run: Are calculated closure variables visible to the thread where the lambda expression is executed?
问:
在使用 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));
}
答:
-1赞
Theodor Zoulias
9/23/2020
#1
是的,TPL 在任务排队时和任务执行的开始/结束时包含适当的内存屏障,以便对其他线程适当地显示值。
来源:
评论