【发布时间】:2011-07-31 03:48:02
【问题描述】:
我正在尝试实现一种应该使用线程或任务并行运行的算法。困难在于我希望线程/任务不时与所有其他线程分享它们的最佳结果。
基本思路是这样的:
//Accessible from each thread
IProducerConsumerCollection<MyObject> _bestObjects;
//Executed in each thread
DoSomeWork(int n){
MyObject localObject;
for(var i = 0; i < n; i++){
//Do some calculations and store results in localObject
if((i/n)%0.5 == 0)
{
//store localObject in _bestObjects
//wait until each thread has stored its result in _bestObjects
//get the best result from _bestObjects and go on
}
}
}
如何使用 System.Threading 或 System.Threading.Tasks 来实现这一点?任务是否真的不应该用于长时间运行的操作?
更新:澄清
拥有一个线程安全的集合不是我的问题,而是让线程停止,发布结果,等到所有其他线程都发布了他们的结果,然后再继续。所有线程将同时运行。 长话短说:
- 对于长时间运行的操作有什么更好的方法?任务或线程或其他什么?
- 假设线程数是在运行时设置的(取决于可用的内核),如何在线程/任务之间进行通信以告知每个线程所有其他线程的状态。
最好的问候
杰
【问题讨论】:
-
可以从阅读Thread-Safe Collections开始
-
这没有帮助。我非常了解 System.Collections.Concurrent,我已经搜索了 MSDN 和 Google 大约两个小时。问题不是要有一个线程安全的对象来存储我的结果,而是让一个线程/任务在特定条件下停止并等待所有其他线程执行相同操作然后继续。
-
如果您只需要一个 (?) 线程在某个时间处于活动状态 - 使用 semaphore。或者我无法得到你的问题:-S
-
见:How to: Synchronize Concurrent Operations with a Barrier。 “Barrier 是一个对象,它可以防止并行操作中的单个任务继续执行,直到所有任务都到达障碍。当并行操作分阶段发生并且每个阶段都需要任务之间的同步时,它很有用。”
-
太好了!障碍正是我所需要的。
标签: c# .net multithreading task-parallel-library