加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

Parallel线程安全问题

发布时间:2020-12-15 21:22:49 所属栏目:asp.Net 来源:网络整理
导读:废话不多说,上代码: using System;using System.Collections.Generic;using System.Threading.Tasks; namespace ParallelTest { class Program { static void Main(string[] args) { List products = new List (); Parallel.For(0,1000000,(i) = { Product

废话不多说,上代码:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ParallelTest
{
class Program
{
static void Main(string[] args)
{
List products = new List();
Parallel.For(0,1000000,(i) =>
{
Product product = new Product();
product.Name = "name" + i;
product.Category = "Category" + i;
product.SellPrice = i;
products.Add(product);
});

        Console.WriteLine(products.Count);
        Console.ReadLine();
    }
}

class Product
{
    public string Name { get; set; }

    public string Category { get; set; }

    public int SellPrice { get; set; }
}

}

猜一下,运行结果是多少,是999999?抱歉不是的,结果!= 999999。

运行结果

Net 4.0引入了System.Threading.Tasks,简化了我们进行异步编程的方式,而不用直接与线程和线程池打交道,但这也引入了线程安全问题。

System.Threading.Tasks中的类型被称为任务并行库(TPL)。TPL使用CLR线程池(说明使用TPL创建的线程都是后台线程)自动将应用程序的工作动态分配到可用的CPU中。

其中Parallel是指数据并行,其提供的Parallel.For()或Parallel.ForEach()方法,可以以并行方式对数组或集合中的数据进行迭代。

那之所以出现这个结果,很显然了,是多线程操作集合导致的线程安全问题。

总之,多线程操作集合时一定要注意线程安全的问题,不管是通过Thread、ThreadPool、Task、Parallel还是PLINQ。

解决方案很简单:

  1. 加锁
  2. 使用并行集合(System.Collections.ConCurrent)

对于这个问题,我知道其存在潜在的线程安全问题,但是不确定其导致的结果如何?当我截图到处询问无果时,才想到自己动手写demo去验证问题。这也是我写这篇文章的初衷:提醒自己,遇到问题,不要凭空猜测,要有动手验证的决心。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读