Информационные технологии Синхронизация процессов. Трегубова_ИБ-314_лр1. Лабораторная работа 1 Синхронизация процессов по дисциплине Информационные технологии Выполнил студент гр. Иб 314 В. Н. Трегубова
Скачать 86.49 Kb.
|
Министерство образования и науки Российской Федерации Уфимский государственный авиационный технический университет Кафедра Вычислительной техники и защиты информации Лабораторная работа №1 «Синхронизация процессов» по дисциплине «Информационные технологии» Выполнил студент гр. ИБ - 314: В.Н. Трегубова Проверил: заведующий кафедрой, д.т.н., профессор, В. М. Картак Уфа 2019 Задание: необходимо разработать программу, в которой было реализовано два потока (нити). Эти потоки должны запускаться одновременно и сортировать один и тот же массив двумя разными способами: методом пузырька. методом выбора максимума. Код программы: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp3 { public partial class Form1 : Form { object key = new object(); private static Semaphore s1; private static Semaphore s2; private static Semaphore s3; int[] mass = new int[10]; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { Random rand = new Random(); listBox1.Items.Clear(); for (int i = 0; i < 10; i++) { mass[i] = rand.Next(0, 50); listBox1.Items.Add(mass[i]); } } private void Puzyrek() { s3.WaitOne(); int a; for (int i = 0; i < 10; i++) for (int j = i + 1; j < 10; j++) { if (checkBox1.Checked == true) lock (key) { if (mass[i] > mass[j]) { a = mass[i]; Thread.Sleep(1); mass[i] = mass[j]; mass[j] = a; } } else { if (mass[i] > mass[j]) { a = mass[i]; Thread.Sleep(1); mass[i] = mass[j]; mass[j] = a; } } } s1.Release(); } private void ViborMax() { s3.Release(); for (int i = 0; i < 10; i++) { int MAX = i; if (checkBox1.Checked == true) lock (key) { for (int j = i + 1; j < 10; j++) { if (mass[j] < mass[i]) { MAX = j; } } int b = mass[MAX]; Thread.Sleep(1); mass[MAX] = mass[i]; mass[i] = b; } else { for (int j = i + 1; j < 10; j++) { if (mass[j] < mass[i]) { MAX = j; } } int temp = mass[MAX]; Thread.Sleep(1); mass[MAX] = mass[i]; mass[i] = temp; } } s2.Release(); } private void button2_Click(object sender, EventArgs e) { Puzyrek(); } private void button3_Click(object sender, EventArgs e) { ViborMax(); } private void button4_Click(object sender, EventArgs e) { s1 = new Semaphore(0, 1); s2 = new Semaphore(0, 1); s3 = new Semaphore(0, 2); Thread myThread = new Thread(ViborMax); myThread.Start(); Thread myThread1 = new Thread(Puzyrek); myThread1.Start(); s1.WaitOne(); s2.WaitOne(); for (int i = 0; i < 10; i++) listBox2.Items.Add(mass[i]); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void listBox2_SelectedIndexChanged(object sender, EventArgs e) { } private void checkBox1_CheckedChanged(object sender, EventArgs e) { } } } Вывод: В ходе выполнения лабораторной работы была разработана и реализована программа с 2 потоками, которые выполняются одновременно. Отсортирован один и тот же массив двумя способами: методом пузырька, методом выбора максимума. |