[英]local variable inside parallel loops thread safety
我在嵌套的parallel.foreach
有一个变量( cnt
)。 我运行这个程序,显然它运作良好。 有谁知道这段代码真的是线程安全的吗? 是否可以在parallel
循环内定义变量?
谢谢。
object obj = new object();
int total=0;
Parallel.For(0, 2, i =>
{
Parallel.For(0, 1000000, j =>
{
int cnt = 0;
if ((arr[i, j] % 2) == 0)
{
Interlocked.Increment(ref cnt);
}
lock (obj)
{
total= total+ (cnt / 2);
}
});
});
此代码是线程安全的 - 唯一的共享数据( total
)已正确同步。 即使不使用Interlocked.Increment
(即:在编辑之前),它仍然是线程安全的。
但是, 效率不高 。
int total=0;
Parallel.For(0, 2,
{
Parallel.For(0, 1000000,
local => 0,
(j, state, local) =>
{
if ((arr[i, j] % 2) == 0)
{
++local;
}
return local;
},
local => Interlocked.Increment(ref total, local)
);
});
此代码确实是安全的,因为lock
语句充当完整的防护操作。 它确保增量操作是原子的,不会受到其他线程的竞争
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.