在线程之间共享数据
本文关键字:数据 共享 之间 线程 | 更新日期: 2023-09-27 18:03:57
我正在尝试实现一个算法,应该使用线程或任务并行运行。困难在于,我希望线程/任务能够不时地与所有其他线程共享它们的最佳结果。
基本思想是这样的:
//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。线程或System.Threading.Tasks,任务不应该用于长时间运行的操作,这是真的吗?
更新:澄清
这不是我的问题,有一个线程安全的集合,但要使线程停止,发布结果,等到所有其他线程已经发布了他们的结果,然后再继续。所有线程将同时运行。长话短说:- 对于长时间运行的操作什么更好?任务或线程或其他东西?
- 如何在线程之间进行通信,以通知每个线程关于所有其他线程的状态,假设线程数量在运行时设置(取决于可用的内核)。
看下面的例子。
public class Worker
{
public SharedData state;
public void Work(SharedData someData)
{
this.state = someData;
while (true) ;
}
}
public class SharedData {
X myX;
public getX() { ... }
public setX(anX) { ... }
}
public class Sharing
{
public static void Main()
{
SharedData data = new SharedDate()
Worker work1 = new Worker(data);
Worker work2 = new Worker(data);
Thread thread = new Thread(new ThreadStart(work1.Work));
thread.start();
Thread thread2 = new Thread(new ThreadStart(work2.Work));
thread2.start();
}
}
bom俚语的回答不准确。不能用ThreadStart
实例化一个新的线程,传递Work
方法需要在上面的例子中传递参数。ParameterizedThreadStart
更合适。Main方法的示例代码看起来更像这样:
public class Sharing
{
public static void Main()
{
SharedData data = new SharedDate()
Worker work1 = new Worker(data);
Worker work2 = new Worker(data);
Thread thread = new Thread(new ParameterizedThreadStart(work1.Work));
thread.start(someData);
Thread thread2 = new Thread(new ParameterizedThreadStart(work2.Work));
thread2.start(someData);
}
}
注意,'work'作为新线程执行的方法被传递给ParameterizedThreadStart,并且需要传递给'work'方法的数据在调用start时被传递。数据必须作为对象传递,因此工作方法还需要将其强制转换回适当的数据类型。最后,还有另一种通过使用匿名方法将数据传递给新线程的方法。