簡體   English   中英

C#多線程同步

[英]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[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 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);
        }
    }

所以你可以看到我正在使用一個數組進行同步。 但我徘徊是不是這樣做的好方法? 這里的操作sync.Contains具有復雜度O(n)並且它處於循環中...是否有更好的方法來進行同步?

我想你想在這里使用障礙物 它是一個允許線程分階段執行的同步對象。 所有線程必須在允許執行下一個階段之前完成一個階段的計算。 這正是您所需要的。

使用數組進行同步不是線程安全的,而是單獨使用“sync.Contains(false)”。

如果兩個線程同時運行sync.Contains(false)並且兩者都返回false會怎么樣?

另外,我看到你的ThreadCount是sideSize平方。 創建大量線程效率非常低。 你擁有的線程越多,你擁有的上下文切換就越多。 上下文切換大約是8000個時鍾周期。 此外,創建一個線程大約需要100,000個時鍾周期,每個線程必須有自己的堆棧,默認情況下大約為4MB。

你想要的是與核心一樣多的線程以及從隊列中提取並處理其工作的每個線程。

你可能最好使用線程池,但我也看到你的線程有一段時間(真實),這意味着它們永遠不會結束。 線程池不適用於長時間運行的線程。

總而言之,我認為您的設計需要一些工作。 由於您似乎在學習,我建議使用允許使用線程池的設計,而不是while(true)循環。

其他人可能會為您提供一個適合您的已知設計模式的“名稱”,但我不知道設計模式的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM