如何解决C#Task.Run:计算得出的闭包变量对执行lambda表达式的线程是否可见?
在使用Lambda表达式在Task中使用值之前,对值进行计算机是否线程安全? 在任务内部,“ param”是从另一个线程使用的。在任务计算后立即启动时,是否保证关闭变量'param'在任务线程上可见? 还是有必要锁定对“参数”的访问? 计算完参数后,从这一点出发应将其视为只读。
无锁:
def f2 (m,g2,h3,rho):
c = m*g+h
rho_p = -rho / p^c
return rho_p
def thermo (p = 0.006112127,H = 1493):
tp = IAPWS97(P= p,h= H )
rho = tp.rho
temp = tp.T
xq = tp.x
tpmu = IAPWS97(T=temp,x= 0)
Mu = tpmu.mu
return rho,temp,xq,Mu
a,b,c,d = thermo(p = 0.006112127,H = 1493)
f2(1,2,3,a)
带锁:
int param = a + b; // param shall be considered immutable after it was calculated
Task.Run(() => MethodWithParameter(param));
解决方法
是的,TPL在任务排队时以及在任务执行的开始/结束时包括适当的内存屏障,以使值适当地对其他线程可见。
来源:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。