Вычисление интеграла алгоритмом Монте-Карло

Содержание

Одной из основных задач параллельного программирования является задача синхронизации двух и более параллельных потоков. Суть этой задачи легко объяснить на примере. Возьмём два потока A и B, предположим, что в потоке A в определённой точке (назовём её «точка события») выполняется некоторое событие (ввод данных, какие-либо расчёты, вывод данных и проч.), а поток B тоже в определённой точке (точке ожидания события) блокируется и ждёт завершения события в потоке A. Таких точек может быть несколько, точки события и точки ожидания события называются точками синхронизации.

Для решения задачи синхронизации существуют различные механизмы синхронизации, одним из самых мощных механизмов является механизм семафоров.

Семафором называется объект, который ограничивает количество потоков, которые могут войти в заданный участок кода. Идея семафора была впервые предложена Эдсгером Дейкстрой в 1960-х, когда еще мало кто писал многопоточные программы.

Эдсгер Дейкстра участвовал в создании операционной системы THE, построенной в виде множества параллельно исполняющихся взаимодействующих процессов, именно во время её разработки и возникли понятия синхронизации процессов, идея семафора, а также была чётко осознана необходимость в структуризации процесса программирования и самих программ.

Языка C# предоставляет для реализации семафоров класс System.Threading.Semaphore, у которого имеются несколько конструкторов. Самый простой конструктор выглядит следующим образом:

public Semaphore(

int initialCount,

int maximumCount

)

Здесь initialCount — начальное значение счётчика семафора, а maximumCount — максимальное значение, которое может принимать счётчик.

Значение счётчика для семафора — это количество запросов, которое может приниматься одновременно. Как видим, в C# семафоры также представлены не бинарным типом, а более функциональным.

Остальные три конструктора в качестве параметров принимают не только начальное и максимальное значение счётчика, но и имя объекта, атрибуты доступа, а также параметр, который возвращает был ли создан новый семафор. Самый сложный конструктор принимает пять параметров:

public Semaphore(

int initialCount,

int maximumCount,

string name,

out bool createdNew,

SemaphoreSecurity semaphoreSecurity

)

Пример создания семафора:

static Semaphore semKD = new Semaphore(1, 1);

В языке C# у класса Semaphore есть множество методов, однако мы рассмотрим лишь некоторые из них, которые обеспечивают непосредственно работу с семафором. Как было разобрано в части про общие сведения, для корректной работы семафора нужны функции входа и освобождения. Класс Semaphore обладает несколькими реализациями данных функций.

WaitOne() — данный метод класса ожидает до тех пор, пока не будет получен семафор, для которого он вызывается. Таким образом, он блокирует выполнение вызывающего потока до тех пор, пока указанный семафор не предоставит разрешение на доступ к ресурсу. Пример вызова метода:

semKD.WaitOne();

У этого метода существуют также перегрузки с другими параметрами, например:

public virtual bool WaitOne(

Выдержка из текста

В настоящее время достаточно широко распространены параллельные программы, ведь они могут выполняться намного быстрее, чем их последовательные аналоги, а значит, повышается и их рыночная стоимость. В некоторых случая скорость выполнения программы очень важна, следовательно, быстрее означает лучше. Решение некоторых задач намного проще и естественнее можно представить в виде одновременно выполняемых процессов, это касается таких областей, как, например, научное программирование, математическое и программирование искусственного интеллекта.

В некоторых ситуациях технологии параллельного программирования снижают трудозатраты разработчика ПО, позволяя ему напрямую реализовать структуры данных, алгоритмы и эвристические методы, разрабатываемые учеными. Иногда имеет смысл думать о решении проблемы как о множестве параллельно выполняемых задач.

Список использованной литературы

. Непейвода Н.Н. Прикладная логика. — Изд-во НГУ.

2. Мендельсон Э. Введение в математическую логику. — М., Наука, 1971.

3. Столл Р.Р. Множества. Логика. Аксиоматические теории. — М., Просвещение, 1968.

4. Мальцев А.И. Алгоритмы и рекурсивные функции. — 2-е изд-е. — М. Наука, 1986, 368 с.

5. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — М.: МЦНМО, 1999.

6. Ахо А.В., Хопкрофт Д.Э., Ульман Д.Д. Структуры данных и алгоритмы. : Пер. с англ. : Уч. пос. — М. : Издательский дом "Вильямс", 2000. — 384 с.

7. Вальковский В.А., Малышкин В.Э. Синтез параллельных программ и систем на вычислительных моделях. — Издательство "Наука", Сибирское отд-е, Новосибирск, 1988г., 129 стр.

8. В.Э.Малышкин, В.Д.Корнеев. Параллельное программирование мультикомпьютеров. – В серии «Учебники НГТУ», Новосибирск, изд-во НГТУ, 2006, 296 стр.

9. Эффективное программирование современных микропроцессоров: учеб. пособие / В.П. Маркова, С.Е. Киреев, М.Б. Остапкевич, В.А. Перепелкин. – Новосибирск: Изд-во НГТУ, 2014 – 148 с.

10. Б. М. Глинский. СИБИРСКИЙ СУПЕРКОМПЬЮТЕРНЫЙ ЦЕНТР КОЛЛЕКТИВНОГО ПОЛЬЗОВАНИЯ: этапы развития, текущее состояние и перспективы // Проблемы информатики, 2013, № 3

11. C# Полный справочник. .

Похожие записи