![]() |
1
12
这个
如果您的类(即T)不能由多个线程处理,那么您不应该尝试并行化这个例程。并不是每个序列都是并行化的候选者——这也是编译器不能自动完成这项工作的原因之一;)
如果您所做的工作需要使用UI线程,那么这仍然是可能的。但是,在任何时候处理后台线程上的用户界面元素时,您都需要同样小心,并将数据封送回UI线程。在许多情况下,使用新的
|
![]() |
2
6
所有这些都是合法的问题——PLINQ/TPL不会试图解决这些问题。 作为开发人员,编写并行化时可以正常工作的代码仍然是您的工作。编译器/tpl/plinq无法将不安全的多线程代码转换为线程安全代码…你必须确保你这样做。 对于您描述的某些情况,您应该首先决定并行化是否明智。 如果瓶颈是获取到数据库的连接或确保正确的操作顺序,那么多线程可能不合适。
在TPL如何将可枚举的流传输到多个线程的情况下,您的假设是正确的。
序列在单个线程上枚举,然后(可能)将每个工作项发送到单独的线程以进行操作。
这个
plinq/tpl帮助您做的是管理何时以及如何将工作分派给多个线程。 TPL检测机器上何时有多个内核,并自动缩放用于处理数据的线程数。如果一台机器只有一个CPU/核心,那么TPL可以选择 不平行化 这项工作。开发人员对您的好处是不必编写两个不同的路径——一个用于并行逻辑,一个用于顺序逻辑。但是,您仍有责任确保代码可以从多个线程同时安全地访问。
这个问题没有人回答…然而,一般的做法是 immutability 在对象设计中。不变性使跨多个线程使用对象更安全,并且是使操作可并行化的最常见做法之一。事实上,像f这样的语言广泛地利用不可变性,使语言能够帮助简化并发编程。
如果你在.NET 4.0上,你也应该研究
|
![]() |
3
2
正如你所猜测的,利用
|
![]() |
4
0
在回答和评论中有一个很好的讨论: Parallel.For(): Update variable outside of loop . 答案是 不 :并行扩展不适合您。多线程问题仍然存在。这是一个很好的语法糖,但不是万能药。 |
![]() |
5
0
这是一个很好的问题,答案不是100%清楚/简洁。我会指给你一点微软的参考资料,它列出了一个很好的细节 WHEN you should use the parallel items . |
![]() |
drainzerrr · Go锁定结构的一部分 7 年前 |
![]() |
Azim · 使用java 8并行处理图像 7 年前 |
|
user8005765 · Karatsuba-多项式与CUDA相乘 7 年前 |
![]() |
Adi · 并行读取大型XSLT字符串 7 年前 |
![]() |
A.J · 同时运行两个python文件 7 年前 |
![]() |
Kristofer · 当索引设置为私有时,如何确保访问缓冲区是私有的 7 年前 |