Вот одна из моих лабораторных работ в институте

Отчет о лабораторной работе  по курсу «Операционные системы параллельной обработки информации»

Тема: Синхронизация потоков средствами классов Monitor и ReaderWriterLock

Цель работы: ознакомление с классами Monitor и ReaderWriterLock, платформой .NET, объектами GDI+ и получение практических навыков разработки многопоточных графических приложений.

Задание: Написать программу (WidowsForms приложение), запускающее множество потоков. Каждый поток выполняет отрисовку падающей буквы. Потоков не должно быть больше, чем горизонтальных позиций на экране.

Листинг:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace LB_2
{
public partial class Form1 : Form
{
// список потоков
List
lst_of_threads = new List
();

// для случайных чисел
static Random rnd = new Random();

// скорость
static int speed = 100;

// максимальное отклонение
static int y_max = 0;

// объект для синхронизации
static Object sync = new object();

// передаваемый параметр
static int XX = 0;

// счетчик для отоброжения состояния потоков
byte timer_counter = 0;

// шрифт для отрисовки
Font fnt = new Font(FontFamily.GenericMonospace, 20, FontStyle.Regular);

// кисти
Brush br_1 = Brushes.Lime;
Brush br_2 = Brushes.Green;
Brush br_3 = Brushes.Gray;

// структура данных
struct data
{
public char ch;
public int top;
}

// список данных
static List lstData = new List();

public Form1()
{
InitializeComponent();
}

// ПП остановки всех потоков
private void Stop_All_thread()
{
// если список пуст выйти
if (lst_of_threads == null) return;
if (lst_of_threads.Count == 0) return;

// останавливаем все пооки поочереди
for (int i = 0; i < lst_of_threads.Count; i++)
lst_of_threads[i].Abort();
}

// ПП старта всех потоков
private void Start_All_threads()
{
// остановим потоки
Stop_All_thread();

// очищаем списки
lst_of_threads.Clear();
lstData.Clear();

// зададим максимальное отклонение по высоте
y_max = pcbScreen.Height / 23;

// зададим максимальное кол-во потоков - по горизонтали
int x_count = pcbScreen.Width / 23;

// создаем и запускаем потоки
for (int i = 0; i < x_count; i++)
{
// зададим XX, для чтения в потоке
XX = i;

// создадим новый поток
Thread t = new Thread(thread);

// запустим новый поток
t.Start();

// добавим в список
lst_of_threads.Add(t);

// создадим новую структуру
data d = new data();

// добавим новую структуру
lstData.Add(d);

// подождем пока поток считает значение XX
while (XX != -1) { Application.DoEvents(); }
}
}

// непосредственно поток
public static void thread()
{
// создадим локальные переменные
int y = 0;
int x = XX; // считаем данные

// дадим понять что данные считаны
XX = -1;

// установим символ по умолчанию
char simbol = ‘X’;

// безконечный цикл
while (true)
{
// если мы в самом верху выберим новый символ
if (y == 0)
{
// получить новый символ
int category = rnd.Next(3);

simbol = (Char)(rnd.Next(10) + 48);
if (category == 0) simbol = (Char)(rnd.Next(25) + 65);
if (category == 1) simbol = (Char)(rnd.Next(25) + 97);
}

// замониторим sync
if (Monitor.TryEnter(sync))
{
// изменим данные в списке для отображения
try
{
lstData.RemoveAt(x);
data d = new data();
d.top = y;
d.ch = simbol;
lstData.Insert(x, d);
}
catch { }

// Thread.Sleep(y);

// освободим sync
Monitor.Exit(sync);

// изменим позицию по вертикали
y++;
if (y > y_max) y = 0;

// спим
Thread.Sleep(Convert.ToInt16(speed + Math.Sqrt(Convert.ToByte(simbol) * Convert.ToByte(simbol) + y * y)));
}
else
{
// если замониторить не получилось, спим дважды
Thread.Sleep(speed * 2);
}
}
}

private void Form1_Load(object sender, EventArgs e)
{
Start_All_threads();
}

private void trackBar1_Scroll(object sender, EventArgs e)
{
// изменение скорости
speed = (trackBar1.Maximum - trackBar1.Value + 1) * 10;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// остановим все потоки
Stop_All_thread();
}
……… чтобы получить полную версию кода напишите мне на adminadminru(гаф)gmail.com

: Написать программу (WidowsForms приложение), запускающее множество потоков

Вывод: в данной лабораторной работе я приобрел навыки синхронизации потоков средствами классов Monitor и ReaderWriterLock.