.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();
}
}
}