Текст
                    Лабораторная работа №
4
. Потоки в Linux (
4
ч.)
Многопоточные приложения и их разработка. Создание и завершение
потоков. Блокирование и возобновление функционирования потока.
Задание
1.
Разработайте приложени
е, демонстрирующее многопоточность
ОС
Linux
: зап
устите
несколько
поток
ов
исполнения. В коде потоков
реализуйте бесконечный цикл (например,
while
(1);
). Продемонстрируйте их
параллельное выполнение (например,
ps
a
--
forest
). Предусмотрите в
приложении
корректное
завершение дополнительных потоков исполнени
я
перед выходом из программы.
Задание
2.
По вариантам.
1)
Разработайте многопоточное приложение для поиска максимального
элемента в
двумерном
массиве из
M
xN
элементов (
0
<
M
<
1
0
000
, 0<
N
<10000
)
в
K
потоков
,
выполняющихся параллельно
(1<
K
<1000
). Значение
K
вво
диться пользователем.
В коде программы предусмотрите возможность автоматического заполнения
массива тестовыми данными и проверки результата последовательным
поиском.
2)
Разработайте многопоточное приложение для сложения двух матриц из
MxN
элементов (
0<
M
<10
000
, 0<
N
<10000)
в
M
потоков, выполняющихся
параллельно. Значения
M
,
N
вводятся пользователем.
В коде программы предусмотрите возможность автоматического заполнения
матриц тестовыми данными и проверки результата однопоточным
сложением.
3)
Разработайте много
поточное приложение для подсчета в двумерном
целочисленном массиве из
MxN
элементов
(0<
M
<10000, 0<
N
<10000)
количества отрицательных
чисел
в
N
потоков, выполняющихся параллельно.
Значения
M
,
N
вводятся пользователем.
В коде программы предусмотрите возможно
сть автоматического заполнения
массива тестовыми данными и проверки результата однопоточным поиском.
4)
Разработайте многопоточное приложение для умножения двух матриц из
NxN
элементов
(0<
N
<10000) в
N
2
потоков, выполняющихся параллельно.
Значение
N
вводитс
я пользователем.
В коде программы предусмотрите возможность автоматического заполнения
матриц тестовыми данными и проверки результата однопоточным
алгоритмом.
5)
Разработайте многопоточное приложение для подсчета количества
совпадающих элементов для двух м
атриц
MxN
(
0<
M
<10000
, 0<
N
<10000
) из
вещественных чисел в
K
потоков, выполняющихся параллельно (
0<
K
<1000)
.
Совпадающими следует считать те элементы, которые находятся на


соответствующих позициях и равны по значению. Значение K вводится пользователем. В коде программы предусмотрите возможность автоматического заполнения матриц тестовыми данным и проверки результата однопоточным алгоритмом. 6) Разработайте многопоточное приложение для умножения двух целочисленных матриц из NxN элементов (0< N <10000) в N потоков , выполняющихся параллельно. Значение N вводится пользователем. В коде программы предусмотрите возможность автоматического заполнения матриц тестовыми данными и проверки результата однопоточным алгоритмом. 7) Разработайте многопоточное приложение для печат и минимальных элементов по строкам в двумерном массиве из MxN элементов (0 < M < 1 0 000 , 0< N <10000 ) в М потоков, выполняющихся параллельно. Значения M и N задаются пользователем. В коде программы предусмотрите возможность автоматического заполнения массива тест овыми данными и проверки результата последовательным поиском. 8) Разработайте многопоточное приложение для вычисления среднего значения элементов двумерного массива вещественных чисел из MxN элементов ( 0< M <10000, 0< N <10000 ) в K потоков, выполняющихся парал лельно. Значения M , N и K задаются пользователем. В коде программы предусмотрите возможность автоматической генерации тестовых данных и проверки результата последовательным вычислением. 9) Разработайте многопоточное приложение для подсчета частоты появления символов в заданной текстовой строке в K потоков, где K – количество искомых символов. Входными данными для программы являются текстовая строка из N символов ( 0< N <100000) и набор символов для подсчета. Результатом работы программы должна быть таблица частот появления этих символов в тексте. В коде программы предусмотрите возможность автоматической генерации тестовой строки и проверки результата последовательным подсчетом. 10) Разработайте многопоточное приложение дл я вычисления разности двух квадратных матриц MxN ( 0< M <10000 , 0< N <10000 ) в K потоков, выполняющихся параллельно. Значение M , N и K вводятся пользователем. В коде программы предусмотрите возможность автоматического заполнения матриц тестовыми данными и прове рки результата однопоточным вычитанием. 11) Разработайте многопоточное приложение для параллельного поиска локальных экстремумов в заданном двумерном массиве из MxN ( 0< M <10000 , 0< N <10000) вещественных чисел в K потоков . M , N и K вводятся пользователем. Рез ультатом работы программы должен быть набор локальных экстремумов с указанием их расположения в массиве. Локальным 
экстремумом будем считать число , которое больше или меньше всех соседних с ним элементов массива . Для простоты граничными элементами массива (0 и M - 1 строки, а также 0 и N - 1 столбцы) можно пренебречь. В коде программы предусмотрите возможность автоматического заполнения массива тестовыми данными и проверки результата однопоточным алгоритмом. 12) Разработайте многопоточное приложение для подсчет а количества вхождений заданного элемента в двумерный целочисленный массив из MxN элементов ( 0< M <10000 , 0< N <10000) в K потоков. Параметры М, N и K вводятся пользователем. В коде программы предусмотрите возможность автоматического заполнения массива тестовы ми данными и проверки результата однопоточным алгоритмом. Дополнительная информация Некоторые о сновные функции потоков POSIX (Pthreads – P OSIX threads) : int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void* (*start)(void *), void *arg); int pthread_join(pthread_t thread, void** value_ptr); int pthread_detach(pthread_t thread); int pthread_exit(void *value_ptr); Названные функции о писаны в /usr/include/pthread.h . Подключаются заголовочным файлом pthread.h . Функция , содержащая код поток а, д олжна быть описана следующим образом (имя функции может быть любым) : void * func_name (void * arg) Например, создание потока из функции start и запись в переменную thr идентификатора потока , мож но записать так : pthread_create(&thr, NULL, start, NULL); Осн овные типы данных : pthread_t – идентификатор потока , аналогичный идентификатору процесса pid_t ; pthread _ attr _ t – тип, задающий объект атрибутов создаваемого потока; значение по умолчанию – NULL . Для компиляции программы , использующей потоки: gcc <входной_ файл> - lpthread [ – o <выходной_файл> ] или g ++ <входной_файл> - lpthread [ – o <выходной_файл>] По умолчанию, без использования опции – o , программа будет скомпилирована в исполнимый файл a . out . 
При использовании интегрированных сред разработки соответствующая библиотека ( pthread ) должна быть добавлена в настройках проекта в зависимости или командную строку сборки приложения. Дополнительные сведения:  Глава 11 Иванов Н.Н. Программирование в Linux . Самоучитель. с.15 8 ;  Глава 12 Мэтью Н., Стоунс Р. Основы программи рования в Linux . с. 573.  Глава 11 Стивенс Р., Раго С. UNIX . Профессиональное программирование. с. 431.