【问题标题】:implementing multi threading to execute a for loop in threads [closed]实现多线程以在线程中执行for循环[关闭]
【发布时间】:2016-12-21 10:46:16
【问题描述】:

我有一个包含 65000 个字符串的字符串类型列表。我需要遍历所有这些字符串并执行一些任务。在 for 循环上运行以迭代 65000 次需要更多时间。所以我想启动 4 到 5 个线程,它们可以划分这个列表数据并单独执行 10000 到 15000 个数据。我已经了解使用 Thread 类启动和中止线程。但是我不清楚多线程和线程管理以及实现锁定机制,以便多个线程不能处理相同的数据并且执行顺序不会改变。

我是线程概念的新手。请帮助。任何代码示例将不胜感激。
谢谢。

【问题讨论】:

  • 不要使用Thread!请改用Task,让框架处理线程池上的任务处理方式。此外,如果您只是从列表中读取,则不需要锁定。
  • 为什么不使用 .NET 的 Parallel.For 或 PLINQ?为什么要自己写?
  • 是的Parallel.For 更适合这种情况。
  • @EpicSam:嗨,如果使用队列而不是列表,是否需要锁定?

标签: c# multithreading threadpool


【解决方案1】:

我建议 PLinq (Parallel Linq) 作为第一次尝试:

  myList
    .AsParallel()
    .WithDegreeOfParallelism(4)
    .ForAll(item => MyRoutine(item));

另一个选项是Parallel.ForEach:

  ParallelOptions op = new ParallelOptions() {
    MaxDegreeOfParallelism = 4,
  };

  Parallel.ForEach(myList, op, item => MyRoutine(item));

编辑:小心,许多类不是线程安全的,包括List<T>(参见下面的cmets)。如果您想将数据具体化到列表中,请使用 PLinq

  List<string> listStrings = myList
    .AsParallel()
    .WithDegreeOfParallelism(4)
    .Select(item => item.text.Substring(5, item.text.Length)))
    .ToList(); // <- this is thread safe   

【讨论】:

  • 嗨,我已经厌倦了你的第一个代码。但它没有执行所有 65000 条记录,它只给出大约 64790 条记录的结果,有什么线索吗?
  • @Naveen kumar:你有抛出异常吗?
  • 不抛出异常。代码正在执行,但结果不准确
  • @Naveen kumar:你执行什么代码?它可能不是线程安全的(例如死锁或竞争条件)。
  • var listStrings = new List(); // 这个列表将有 65000 个字符串 var data = new List(); ParallelOptions op = new ParallelOptions() { MaxDegreeOfParallelism = 4, }; Parallel.ForEach(listStrings, op, item => data.Add(item.text.Substring(5, item.text.Length))); =====这是我的代码输出错误,完成后我的数据列表没有 65000 个字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多