/
Текст
Лабораторная работа №
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.