C#多线程同步

C#多线程同步,c#,multithreading,synchronization,C#,Multithreading,Synchronization,我正在做一个需要多线程同步的程序。以下是我的方法: private void RunSimulation() { int sideSize = (int)Math.Ceiling((double)_simulationField.GetLength(0) / (double)MAX_SECTOR_SIZE); int threadsCount = sideSize * sideSize; sync = new bool[thread

我正在做一个需要多线程同步的程序。以下是我的方法:

    private void RunSimulation()
    {
        int sideSize = (int)Math.Ceiling((double)_simulationField.GetLength(0) / (double)MAX_SECTOR_SIZE);
        int threadsCount = sideSize * sideSize;
        sync = new bool[threadsCount + 1];
        for (int i = 0; i < sync.Length; i++)
        {
            sync[i] = false;
        }
            for (int sector = 0; sector <= threadsCount; sector++)
            {
                Thread sectorThread = new Thread(DoSector);
                sectorThread.IsBackground = true;
                sectorThread.Start(sector);
            }
    }
private void RunSimulation()
{
int sideSize=(int)数学上限((双精度)模拟字段.GetLength(0)/(双精度)最大扇区大小);
int THREADSCONT=侧尺寸*侧尺寸;
sync=新bool[threadscont+1];
for(int i=0;i对于(int sector=0;sector我想您应该在这里使用。它是一个允许线程分阶段执行的同步对象。所有线程都必须在一个阶段完成计算,然后才能执行下一个阶段。这正是您所需要的。

使用数组进行同步不是线程安全的,而是单独的“同步”(假)"

如果两个线程同时运行sync.Contains(false),并且都返回false,该怎么办

另外,我看到你的线程数是sideSize squared。创建大量线程是非常低效的。线程越多,上下文切换就越多。上下文切换大约是8000个时钟周期。另外,创建一个线程需要大约100000个时钟周期,每个线程必须有自己的堆栈,默认情况下大约是4MB

您需要的是与内核一样多的线程,以及从队列中提取并处理其工作的每个线程

您可能最好使用线程池,但我也看到您的线程在一段时间内(真的),这意味着它们永远不会结束。线程池不适用于长时间运行的线程

总之,我认为您的设计需要一些工作。因为您似乎正在学习,所以我建议您使用线程池,而不是while(true)循环


其他人可能会给你一个“名字”对于一个已知的设计模式,它会对您有效,但我不知道设计模式的名称。

谢谢!如果我在无限循环中使用ThreadPool,而不是创建几个线程来使用这种类型的循环,那么设计会怎么样?这样更好吗?假设我正确理解您,是的。那么,一个主循环会向线程池添加工作你让线程池担心线程管理。我知道.Net 4.0的泛型任务可能适用于此。但你可能希望搜索特定于线程的“设计模式”。祝你好运,很抱歉我帮不了你更多。
    private void DoSector(object obj)
    {
        int sector = (int)obj;
        Library.Pair sectorPosition = GetSectorPosition(sector);
        while (true)
        {

            for (int i = sectorPosition.X; i < sectorPosition.X + MAX_SECTOR_SIZE && i < _simulationField.GetLength(0); i++)
            {
                for (int j = sectorPosition.Y; j < sectorPosition.Y + MAX_SECTOR_SIZE && j < _simulationField.GetLength(1); j++)
                {
                    if (_simulationField[i, j] != null)
                    {
                        MoveCreature(_simulationField[i, j], i, j);
                    }
                }
            }
            sync[sector] = true;
            while (sync.Contains(false) && sector != sync.Length)
            {
                Thread.Sleep(10);
            }
            if (sector == sync.Length)
            {
                for (int i = 0; i < sync.Length; i++)
                {
                    sync[i] = true;
                }
            }
            Thread.Sleep(500);
        }
    }