МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П. О. СУХОГО
Факультет автоматизированных и информационных систем
Кафедра «Информационные технологии»
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ № 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();
}
}
}
Результаты работы программы:
Вывод: разработать программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.