Лабораторная 12
Параллельный рассчет площади криволинейной трапеции.
Синхронизация параллельных потоков.

(материал из свободной энциклопедии Wikipedia)

Криволинейная трапеция — плоская, ограниченная графиком неотрицательной непрерывной функции y=f(x) определенной на отрезке [a; b], осью абсцисс и прямыми x=a и x=b

Для нахождения площади криволинейной трапеции пользуются интегралом или

Это значит, что площадь криволинейной трапеции можно найти по сумме значений функции y=f(x) взятые через бесконечно малые промежутки по оси Ох на отрезке от a до b

Можно сказать, что мы разбили криволинейную трапецию на бесконечное число прямоугольников, длина каждого из которых равна ординате функции y=f(x) через бесконечно малые промежутки по оси Ох на отрезке от a до b, а ширина — бесконечно малому значению х, нашли их площади произведением длины на ширину и сложили. Предел суммы их площадей равен площади криволинейной трапеции.

Требования к средствам разработки и исполнения

Решения задач должны быть разработаны кроссплатформенными языковыми средствами, корректно компилироваться и функционировать в операционных системах Windows и Linux.

Условие задачи

Дана криволинейная трапеция, ограниченная сверху функцией ex2.
  1. Найти ее площадь на промежутке от a до b, разбив на n равных интервалов по оси абсцисс. Значения a,b,n передаются в командной строке, тип a и b - вещественный, тип n - неотрицательный. Результат работы программы - рассчитанная площадь и время рассчета в миллисекундах. Подобрать значения a, b и n таким образом, чтобы время рассчета было порядка 10 секунд.
  2. Распараллелить решение предыдущей задачи, передавая и обрабатывая четвертый параметр numt - количество потоков в программе. Каждый поток обрабатывает свой набор (n div numt) интервалов из диапазона от a до b, основной поток обрабатывает остаток интервалов n mod numt, дожидается окончания работы остальных потоков, суммирует полученные интервалы, выводит рассчитанную площадь и время рассчета в миллисекундах. Сравнить время работы первого и второго решения на различных значениях numt, сделать выводы.
  3. Модифицировать предыдущее решение следующим образом: при старте программы создается текстовый файл с именем программы и расширением ".txt".

    Раз в секунду (пример), а также один раз по окончании рассчета, каждый поток (в том числе - основной) должен дописывать к указанному файлу 4 строки, блокируя при этом другие потоки:

    1. номер потока и количество миллисекунд, прошедшее с начала старта рассчета
    2. номер потока и количество обработанных интервалов
    3. номер потока и текущую рассчитанную сумму
    4. пустую строку-разделитель.
    По завершении всех рассчетов основной поток должен дописать в файл 3 строки:
    1. количество миллисекунд, прошедшее с начала старта рассчетов
    2. результирующее количество обработанных интервалов
    3. результирующую рассчитанную сумму
    4. пустую строку-разделитель.
    Сравнить результат работы данной программы с альтернативным вариантом, не предусматривающим синхронизации.