1

Тема: Средства синхронизации потоков, критические секции и тупики

Задание: написать приложение, увеличивающее значение глобальной переменной с помощью двух потоков и возможностью установления приоритета для этих потоков.
Код программы:
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;
        }
    }
}

Поделиться