Академический Документы
Профессиональный Документы
Культура Документы
Процесс 2
Процесс 1 (нить 2)
(нить 1)
Индивидуальные задания
Вариант задания имеет вид:
SFOX, где
S – команда обработки строк (1 - 10):
1. Объединение двух строк
2. Подсчет длины текста
3. Подсчет средней длины слов строки (строка разделяется на слова
с помощью звездочки)
4. Подсчет количества слов из цифр (строка разделяется на слова с
помощью двоеточия)
5. Подсчет суммы отрицательных чисел – слов строки (строка
разделяется на слова с помощью запятой)
1
6. Подсчет числа 5-символьных слов из латинских букв в строке
(строка разделяется на слова с помощью запятой)
7. Выделение подстроки заданной длины с начала строки
8. Подсчет количества указанного символа в строке
9. Сравнение двух строк и выдача количества несовпадающих
символов
10. Вставка одной строки в другую с заданного символа
F – команда обработки массива (1 - 6):
1. Подсчет количества отрицательных элементов в массиве
2. Подсчет количества неотрицательных элементов в массиве
3. Подсчет суммы положительных чисел массива
4. Подсчет числа положительных элементов с четными индексами
5. Замена отрицательных элементов массива их квадратами
6. Удаление из массива четных элементов
O - вариант обмена данными между потоками (1-3)
1. неименованный канал
2. именованный канал
3. файл
X - вариант синхронизации использования ресурсов (1-3)
4. lock
5. mutex
6. monitor
Анонимные каналы.
2
AnonymousPipeServerStream предоставляет доступ в одном направлении (In
или Out) и инициирует впоследствии доступ к другому классу
AnonymousPipeClientStream.
Канал создается с помощью вызова
AnonymousPipeServerStream(PipeDirection direction)
Затем этот канал переназначается на поток ввода или вывода (StreamReader
или StreamWriter), из которого читается/в который пишется информация.
AnonymousPipeClientStream предоставляет доступ в одном направлении (In
или Out), зная дескриптор канала, созданного серверным потоком.
Дескриптор канала можно получить с помощью функции серверного канала
GetClientHandleAsString().
Канал создается с помощью вызова
AnonymousPipeClientStream(PipeDirection напрравление,SafePipeHandle
дескриптор канала, созданного сервером)
Именованные каналы.
3
Для подключения к серверу NamedPipeClientStream должен выполнить
метод Connect()
Синхронизация потоков
4
Оператор lock
Оператор lock предназначен для того, чтобы одному потоку не дать войти в
важный раздел кода в тот момент, когда в нем находится другой поток. При
попытке входа другого потока в заблокированный код потребуется
дождаться снятия блокировки объекта. Этот оператор оформляется
следующим образом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace OperatorLock
{class Program
{
public static int i, j;
public static void ThreadStart()
{
if (i != j)
Console.WriteLine("Ошибка");
i++;
Thread.Sleep(200);
j++;
Console.WriteLine("{0},{1}", i, j);
5
static void Main(string[] args)
{
for (int i = 0; i < 10; ++i)
{ Thread th1 = new Thread(() => ThreadStart());
Th1.Start();
Thread.Sleep(100);
Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
6
using System.Threading;
namespace OperatorLock
{ class Program
{ public static int i, j;
Console.ReadLine();
}
}
}
7
Результат выполнения программы с оператором lock
Класс Monitor
Класс Monitor предназначен для того, чтобы контролировать доступ к
объектам, предоставляя блокировку объекта одному потоку. Блокировки
объектов предоставляют возможность ограничения доступа к части кода,
обычно называемой критической секцией. Пока поток владеет блокировкой
для объекта, никакой другой поток не может ею завладеть.
В классе Monitor определено несколько методов синхронизации. Например,
чтобы получить возможность блокировки для некоторого объекта,
вызывается метод Enter(), а чтобы снять блокировку - метод Exit(). Эти
методы имеют следующий формат:
public static void Enter(object syncOb)
public static void Exit(object syncOb)
где syncOb - синхронизируемый объект. Если при вызове метода Enter()
заданный объект недоступен, вызывающий поток будет ожидать до тех пор,
пока объект не станет доступным.
Использование оператора lock эквивалентно вызову метода Enter() с
последующим вызовом метода Exit() класса Monitor.
8
Класс Mutex
public Mutex()
public Mutex(bool initiallyOwned);
public Mutex(bool initiallyOwned, string name_mutex)
mutex.ReleaseMutex();
9
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Mutext
{
class Program
{
private static Mutex mut = new Mutex();
private const int numIterations = 1;
private const int numThreads = 3;
private static void Main(string[] args)
{
// Создаем потоки, которые будут использовать защищенный ресурс
for (int i = 0; i < numThreads; i++)
{
Thread myThread = new Thread(new ThreadStart(MyThreadProc));
myThread.Name = String.Format("Поток{0}", i + 1);
myThread.Start();
}
// Главный поток завершил работу
}
private static void MyThreadProc()
{
for (int i = 0; i < numIterations; i++)
{
UseResource();
}
}
//Синхронизируем данный метод
private static void UseResource()
{
mut.WaitOne();
Console.WriteLine("{0} зашел в защищенную зону",
Thread.CurrentThread.Name);
// Имитируем работу
Thread.Sleep(500);
Console.WriteLine("{0} покинул защищенную зону",
Thread.CurrentThread.Name);
// Release the Mutex.
mut.ReleaseMutex();
Console.ReadLine();
}
10
}}
11