繁体   English   中英

并行循环内部的局部变量线程安全

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM