在线程之间共享数据

本文关键字:数据 共享 之间 线程 | 更新日期: 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,任务不应该用于长时间运行的操作,这是真的吗?

更新:澄清

这不是我的问题,有一个线程安全的集合,但要使线程停止,发布结果,等到所有其他线程已经发布了他们的结果,然后再继续。所有线程将同时运行。长话短说:
  1. 对于长时间运行的操作什么更好?任务或线程或其他东西?
  2. 如何在线程之间进行通信,以通知每个线程关于所有其他线程的状态,假设线程数量在运行时设置(取决于可用的内核)。

问好周杰伦

在线程之间共享数据

看下面的例子。

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时被传递。数据必须作为对象传递,因此工作方法还需要将其强制转换回适当的数据类型。最后,还有另一种通过使用匿名方法将数据传递给新线程的方法。