Вот одна из моих лабораторных работ в институте
Отчет о лабораторной работе по курсу «Операционные системы параллельной обработки информации»
Тема: Синхронизация потоков средствами классов 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

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






