.NET 4.x синхронизация потоков - C# (233272)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Имеется несколько потоков, каждый поток выполняет генетический алгоритм, как их синхронизировать, чтобы в определенный момент времени потоки смогли обменяться данными? То есть, как только генетический алгоритм доходит до 5 поколения(например), каждый поток приостанавливается, происходит обмен данными между этими потоками, а потом генетические алгоритмы дальше продолжают работу.

Решение задачи: «.NET 4.x синхронизация потоков»

textual
Листинг программы
    public partial class Form1 : Form
    {
        void migration()
        {
            
                //миграция
            
        }
        private void StartGeneticAlg(int TM)
        {
            List<Thread> Th = new List<Thread>();
 
            Gens = new GeneticAlg[island];
            Barrier bar = new Barrier(island, b => {migration();});
            int[,] mat = GetM(city, A, B, TM);
            for (int i = 0; i < island; i++)
            {
                Gens[i] = new GeneticAlg(city, chance, repeat, osob, mat, bar, FileLog,island);
            }
            for (int i = 0; i < island; i++)
            {
                Th.Add(new Thread(Gens[i].live));
               
                Thread.Sleep(100);
                Th[Th.Count - 1].Start();
            }
            for (int i = 0; i < island; i++)
            {
                Th[i].Join();
                LogBox.Items.Add(Gens[i].Best.value);
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
                StartGeneticAlg(TypeMatrix);
        }
    }
    public class GeneticAlg
    {
 
        // Поля
 
        public void live()
        {
            int cZav = 0;
            Indevidual prev, now;
            prev = AdamGeneration();
            while (cZav != cColen && Pocol != MaxPocol - 1)
            {
                now = getColen(Pocol);
                if (prev.value == now.value)
                {
                    cZav++;
                }
                else
                    cZav = 0;
                prev = now;
                if (Pocol%5==0 && Pocol!=0)
                {
                    barrier.SignalAndWait();
                    file.WriteLine("<++++++ Barrier ++++++>");
                }
                Pocol++;
 
            }
            //barrier.AddParticipants();
 
            if (Pocol == MaxPocol - 1)
            {
                file.WriteLine("Зацикливание");
            }
            else
            {
                BestOfTheBest = FindMinOs(Pocol);
                WriteToFile(FindMinOs(Pocol));
            }
            if (cZav == cColen)
            {
                file.WriteLine("Число совподений достигло " + cColen);
            }
            file.Close();
 
        }
        
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы