Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3468

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
5.57 Mб
Скачать

8. Теперь надо создать два потока, каждый из которых будет инициализировать массив massiv: первый поток – от 0 до 128, второй – от 128 до 255. Для этого выполнить следующие изменения программы:

-добавить в перечень используемых модулей дополнительный

using System.Threading;

-закомментировать вызовы инициализации массива в событии объекта Button2 и вместо этих операторов добавить операторы работы с многопоточным приложением;

-создать два потока:

Thread pot1 = new Thread(new

ParameterizedThreadStart(Initmassiv));

Thread pot2 = new Thread(new

ParameterizedThreadStart(Initmassiv));

-запустить два потока: pot1.Start(0); pot2.Start(128);

-ждать завершения работы потоков: pot1.Join();

pot2.Join();

-изменить метод, инициализирующий массив, следующим образом: тип аргумента n изменить на object, в теле метода добавить оператор преобразования типа переменной n

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

public void Initmassiv(object n) // 1 или 128

{

int n1 = (int)n;

for (int i = 0; i < 128; i++)

{

massiv[i] = i + n1;

61

Thread.Sleep(10);

}

}

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

Рис. 42. Экранная форма программы инициализации массива двумя потоками

62

Задание 2. Составить программу для задачи Задания 1. Выполнение инициализаций реализовать в двух отдельных потоках с синхронизацией инициализирующих массив потоков с помощью различных методов синхронизации потоков.

Представлен пример выполнения задания для таких методов синхронизации, как монитор, мьютекс и семафор.

Ход выполнения задания для реализации монитора:

1.Скопировать проект задания 1 и произвести в нем следующие изменения.

2.В коде программы после описания массива добавить описание переменной syn - объекта синхронизации для реализации монитора:

Object syn;

3.В метод Initmassiv добавить операторы, первый из которых установить в начале метода (он включит блокировку и до завершения выполнения метода не пустит другой поток), второй оператор – последний метода инициализации массива (он снимет блокировку и инициализация массива будет доступна другому потоку):

Monitor.Enter(syn); - включение блокировки Monitor.Exit(syn); - снятие блокировки

4. В объекте Button2 изменить свойство Text на «Мони-

тор».

5.В событии объекта Button2 добавить оператор для создания объекта синхронизации до описания потоков:

syn = new Object();

63

6. Запустить программу на выполнение. Пример экранной формы программы синхронизации потоков методом монитора представлен на рис. 43.

Рис. 43. Синхронизация потоков методом монитора

Ход выполнения задания для реализации мьютекса:

1.Скопировать проект задания 1 и произвести в нем следующие изменения.

2.В коде программы после описания массива добавить оператор для создания мьютекса:

Mutex m = new Mutex();

3.В метод Initmassiv добавить операторы, первый из которых установить в начале метода (он включит блокировку и до завершения выполнения метода не пустит другой поток), второй оператор – последний метода инициализации массива (он снимет блокировку и инициализация массива будет доступна другому потоку):

m.WaitOne(); - включение блокировки

64

m.ReleaseMutex(); - снятие блокировки

4. В объекте Button2 изменить свойство Text на «Мьютекс».

5.Запустить программу на выполнение. Экранная форма программы синхронизации потоков методом мьютекса аналогична форме на рис. 43.

Ход выполнения задания для реализации семафора:

1.Скопировать проект задания 1 и произвести в нем следующие изменения.

2.В коде программы после описания массива добавить оператор для создания семафора:

Semaphore s = new Semaphore(1, 1);

3.В метод Initmassiv добавить операторы, первый из которых установить в начале метода (он включит блокировку и до завершения выполнения метода не пустит другой поток), второй оператор – последний метода инициализации массива (он снимет блокировку и инициализация массива будет доступна другому потоку):

s.WaitOne(); - включение блокировки s.Release(); - снятие блокировки

4. В объекте Button2 изменить свойство Text на «Семафор».

5.Запустить программу на выполнение. Экранная форма программы синхронизации потоков методом семафора аналогична форме на рис. 43.

Листинг программы выполнения задания с синхронизацией потоков с помощью критических разделов представлен на рис. 44.

65

Рис. 44. Фрагмент 1 листинга

66

Рис. 45. Фрагмент 2 листинга

Экранная форма программы до и после синхронизации представлена на рис. 46.

67

Рис. 46. Результаты работы программы до и после синхронизации

Задание 3. Представлен пример разработки программы для расчета решета Эратосфена, чисел Фибоначчи, факториала с синхронизацией потоков. Реализовать аналогичное приложение для расчета в двух потоках функции, позволяющей увеличивать заданный массив из 500 элементов сначала в 2 раза, а затем в 5 раз.

1) Добавим элементы textBox1, textBox2, textBox3, listBox1, listBox2, listBox3, button1, button2, button3, button4, button5, label1, label2, label3, label4, trackBar1, trackBar2, trackBar3, trackBar4, richTextBox1 на форму согласно рис. 47.

2)Теперь подключим необходимые библиотеки: using System.IO;

68

using System.Threading;

Рис. 47. Расположение элементов на форме

3)Объявим необходимые переменные в классе Form1

private ThreadStart t1;

//Делегат; представляет метод, выпол-

няющийся в первом потоке

private ThreadStart t2;

//Делегат; представляет метод, выпол-

няющийся во втором потоке

private ThreadStart t3;

//Делегат; представляет метод, выпол-

няющийся в третьем потоке

private Thread Thread_1;

//Первый поток

private Thread Thread_2;

//Второй поток

private Thread Thread_3;

//Третий поток

 

69

private Semaphore s;

//Семафор, служащий для ограничения

//числа потоков, которые обращаются к richTextBox1

private bool first;

//Переменная, хранящая информацию

//первый ли запуск потоков

private int pause;

//Переменная, хранящая длительность

//паузы

 

4)Изменим стандартный конструктор формы public Form1()

{

InitializeComponent();

//Инициализация элементов фор-

мы

 

s = new Semaphore(1, 1); //Создание семафора с начальным и //максимальным количеством запросов для семафора, которое //может быть обеспечено одновременно

int n1 = 1000; //Переменная для расчета решета Эратосфена

textBox1.Text = n1.ToString();

 

int n2 = 100;

//Переменная для расчета чисел Фибоначчи

textBox2.Text = n2.ToString();

 

int n3 = 10;

//Переменная для расчета факториала

textBox3.Text = n3.ToString();

 

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls

= false;

//Отменяем проверку на доступ к объектам,

//созданным из другого потока

 

first = true;

//Указываем первый запуск

button2.Text = "Поток №1 не запущен";

//Изменяем текст

//кнопки button2

 

 

 

button3.Text = "Поток №2 не запущен";

//Изменяем текст

//кнопки button3

 

 

 

button4.Text = "Поток №3 не запущен";

//Изменяем текст

//кнопки button4

 

 

 

button2.Enabled = false;

//Блокируем кнопку button2

 

 

70

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]