Программирование многопоточных приложений в .Net. Программа, осуществляющая решение поставленной задачи с помощью многопоточного приложения

Страницы работы

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П. О. СУХОГО

Факультет автоматизированных и информационных систем

Кафедра «Информационные технологии»

ОТЧЕТ   ПО   ЛАБОРАТОРНОЙ   РАБОТЕ   № 8

по дисциплине «Мультипрограммная и мультипроцессорная обработка

данных»

на тему:     «Программирование многопоточных приложений в .Net»

Выполнил:        студент гр. ИТ-32

Принял: преподаватель

Гомель 2013

Программирование многопоточных приложений в .Net

Цель работы: разработать программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения.

Задание:

Разработать многопоточное приложение вычисляющее параллельно значения заданной функции на отрезке [A; B] и на отрезке [C; D] с шагом ∆x . Все коэффициенты α i , β j , γk и значение функции f (x) вычислять параллельно в отдельных потоках (должно быть не менее 5 параллельных потоков). Результаты вычислений сохранять в текстовые файлы. В первый файл сохранить результаты вычислений функции f (x) на отрезке [A; B] и все коэффициенты α i  , β j , γk  , во второй – значения f (x) на отрезке [A; B] на отрезке [C;D]. Для синхронизации потоков использовать указанные средства синхронизации.

Обеспечить монопольный доступ к файлам каждому из потоков, для этого использовать средства синхронизации.

Листинг программы:

using System.Threading;

using System.IO;

amespace MnogoPotocn

{public partial class Form1 : Form

{public Form1()

{InitializeComponent();

}

public class Dannie  //структура данных,передаваемая в качестве параметра

{double a;//начальное значение интервала

public double b;//конечное значение интервала

public double dx;//шаг       

public double[] buffer;//буффер

int i;//текущее значение параметра для главного цикла

public bool gotov;//флаг для выполнения потоков необходимое количество раз

long[] sinx;//переменные для синхронизации

public Mutex MutexViv;

public Mutex MutexMain;

public string FileName;

public Dannie(double za, double zb, double zdx, string fn)//конструктор

{a = za; b = zb; dx = zdx;

buffer = new double[5];

sinx = new long[4];

sinx[0] = 1; sinx[1] = 0; sinx[2] = 0; sinx[3] = 0;

i = 0;

gotov = true;

MutexViv = new Mutex(false, "mutex_abg");

MutexMain = new Mutex(false, "mutex_main");

FileName = fn;

}

public double this[int n]

{ get { return buffer[n]; }

set { buffer[n] = value; }

}

public double X

{get { return a; }

set { a = value; }

}

public int I

{get { return i; }

set { i = value; }

}

public void Wait(int num)

{while (sinx[num] == 0) Thread.Sleep(5);

}

public void TestAndSet(int num)

{if (sinx[num] == 0) Interlocked.Increment(ref sinx[num]);

else Interlocked.Decrement(ref sinx[num]);

}

}

public static void Alfa(object par)//вычисление значения альфа

{//получаем данные из структуры

Dannie d=(Dannie) par;

while(d.gotov)

{         d.Wait(0);    

double sum=0;

for(int j=1;j<=d.I;j++)

sum=sum+Math.Sin(d.X);

d.buffer[0]=sum;

d.TestAndSet(0);//запрещаем выполнение потока альфа

d.TestAndSet(1);//разрешаем выполнение потока бетта

//MessageBox.Show(d.I.ToString(), "Выполнено", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

public static void Betta(object par)//вычисление значения бетта

{//получаем данные из структуры

Dannie d=(Dannie) par;

while(d.gotov)

{         d.Wait(1);    

double sum=0;

for(int j=1;j<=d.I;j++)

sum=sum+Math.Sin(d.X)*d.buffer[0];

d.buffer[1]=sum;

d.TestAndSet(1);//запрещаем выполнение потока бетта

d.TestAndSet(2);//разрешаем выполнение потока гамма

}

}

public static void Gamma (object par)//вычисление значения гаммы

{//получаем данные из структуры

Dannie d=(Dannie) par;

while(d.gotov)

{

d.Wait(2);

double sum=0; //вычисление y

for(int j=1;j<=d.I;j++)

sum=sum+1f/(d.I);

sum=sum*d.buffer[0];                        

d.buffer[3]=sum;  //вычисление гаммы

sum=0;

for(int j=1;j<=d.I;j++)

sum=sum+Math.Sin(d.X)*Math.Cos(d.buffer[3]);                        

d.buffer[2]=sum;

d.TestAndSet(2);//запрещаем выполнение потока гамма

d.TestAndSet(3);//разрешаем выполнение потока MainThread

}

public static void  MainThread(object par)

{//получаем данные из структуры,передаваемой в качестве параметра

Dannie d=(Dannie) par;

StreamWriter Write = new StreamWriter(d.FileName+".txt");

//объявляем потоки

Thread[] hThread=new Thread[3];

hThread[0]=new Thread(new ParameterizedThreadStart(Alfa));

hThread[1]=new Thread(new ParameterizedThreadStart(Betta));

hThread[2]=new Thread(new ParameterizedThreadStart(Gamma));

for (int i = 0; i < hThread.Length; i++)

{

hThread[i].IsBackground = true;

hThread[i].Start(d);

}

while(d.X<=d.b)

{double summa=0;  

for(d.I=0;d.I<=1000;d.I=d.I+1)         

{

d.Wait(3);  

summa=summa+(Math.Pow((1+d.X),d.buffer[0])+Math.Pow((1+d.X),d.buffer[1])+Math.Pow((1+d.X),d.buffer[2]));

d.MutexViv.WaitOne(-1,false);

Write.WriteLine("A[" + d.I.ToString() + "]=" + d.buffer[0].ToString() + "  B[" + d.I.ToString() + "]=" + d.buffer[1].ToString() + "  G[" + d.I.ToString() + "]=" + d.buffer[2].ToString());

d.MutexViv.ReleaseMutex();

d.TestAndSet(3);//запрещаем выполнение потока MainThread

d.TestAndSet(0);//разрешаем выполнение потока альфа           

}

d.buffer[4]=summa;

d.MutexMain.WaitOne(-1,false);

Write.WriteLine("f(" + d.X.ToString() + ")=" + d.buffer[4].ToString());

d.MutexMain.ReleaseMutex();

d.X=d.X+d.dx;

}

d.gotov=false;//прекращаем выполнение всех потоков

Write.Close();

MessageBox.Show("Вычисления завершены! Файлы с результатами успешно сохранены!","Выполнено",MessageBoxButtons.OK,MessageBoxIcon.Information);

}

private void button1_Click(object sender, EventArgs e)

{Dannie d1 = new Dannie(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox7.Text),"1");

Dannie d2 = new Dannie(Convert.ToDouble(textBox3.Text), Convert.ToDouble(textBox4.Text), Convert.ToDouble(textBox8.Text), "2");

Thread hThread1 = new Thread(new ParameterizedThreadStart(MainThread));

Thread hThread2 = new Thread(new ParameterizedThreadStart(MainThread));

hThread1.IsBackground = true;

hThread2.IsBackground = true;

hThread1.Priority = ThreadPriority.Highest;

hThread2.Priority = ThreadPriority.Highest;

hThread1.Start(d1);

hThread2.Start(d2);

hThread1.Join(-1);

textBox5.Text=d1.buffer[4].ToString();

textBox6.Text=d2.buffer[4].ToString();

}

}

}

Результаты работы программы:

Вывод: разработать программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения.

Похожие материалы

Информация о работе