Тема: Средства синхронизации потоков, критические секции и тупики
Задание: написать приложение, увеличивающее значение глобальной переменной с помощью двух потоков и возможностью установления приоритета для этих потоков.
Код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; // содержит классы и интерфейсы, которые дают возможность программировать в многопоточном режиме
namespace Laba4TVP
{
public partial class Form1 : Form
{
private static Mutex mutex = new Mutex(); // примитив синхронизации, который также может использоваться в межпроцессорной синхронизации
private static int global = 100;
public static string str1 = "Значения из потока №1:";
public static string str2 = "Значения из потока №2:";
public static void Runner1()
{
mutex.WaitOne(); // блокирует текущий поток
for (int i = 0; i < 6; i++)
str1 += " " + global++;
mutex.ReleaseMutex(); // освобождает объект Mutex один раз
}
public static void Runner2()
{
for (int i = 0; i < 6; i++)
str2 += " " + global++;
}
public Form1()
{
InitializeComponent();
CenterToScreen();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string select = comboBox1.SelectedItem.ToString();
if (select == "Lowest")
label3.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с любыми другими \nприоритетами.";
if (select == "BelowNormal")
label3.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом Normal \nи до потоков с приоритетом Lowest.";
if (select == "Normal")
label3.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом AboveNormal \nи до потоков с приоритетом \nBelowNormal. По умолчанию потоки \nимеют приоритет Normal.";
if (select == "AboveNormal")
label3.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом Highest \nи до потоков с приоритетом Normal.";
if (select == "Highest")
label3.Text = "Выполнение потока может быть \nзапланировано до выполнения \nпотоков с любыми другими \nприоритетами.";
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
string select = comboBox2.SelectedItem.ToString();
if (select == "Lowest")
label4.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с любыми другими \nприоритетами.";
if (select == "BelowNormal")
label4.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом Normal \nи до потоков с приоритетом Lowest.";
if (select == "Normal")
label4.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом AboveNormal \nи до потоков с приоритетом \nBelowNormal. По умолчанию потоки \nимеют приоритет Normal.";
if (select == "AboveNormal")
label4.Text = "Выполнение потока может быть \nзапланировано после выполнения \nпотоков с приоритетом Highest \nи до потоков с приоритетом Normal.";
if (select == "Highest")
label4.Text = "Выполнение потока может быть \nзапланировано до выполнения \nпотоков с любыми другими \nприоритетами.";
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart runner1 = new ThreadStart(Runner1);
ThreadStart runner2 = new ThreadStart(Runner2);
Thread th1 = new Thread(runner1);
Thread th2 = new Thread(runner2);
string select1 = comboBox1.SelectedItem.ToString();
string select2 = comboBox2.SelectedItem.ToString();
if (select1 == "Lowest")
th1.Priority = ThreadPriority.Lowest;
if (select1 == "BelowNormal")
th1.Priority = ThreadPriority.BelowNormal;
if (select1 == "Normal")
th1.Priority = ThreadPriority.Normal;
if (select1 == "AboveNormal")
th1.Priority = ThreadPriority.AboveNormal;
if (select1 == "Highest")
th1.Priority = ThreadPriority.Highest;
if (select2 == "Lowest")
th2.Priority = ThreadPriority.Lowest;
if (select2 == "BelowNormal")
th2.Priority = ThreadPriority.BelowNormal;
if (select2 == "Normal")
th2.Priority = ThreadPriority.Normal;
if (select2 == "AboveNormal")
th2.Priority = ThreadPriority.AboveNormal;
if (select2 == "Highest")
th2.Priority = ThreadPriority.Highest;
th1.Start(); label5.Text = str1;
th2.Start(); label6.Text = str2;
}
}
}