Лабораторная работа №4
по курсу лекций “Операционные системы”
Сорокин Н.Ю., 2004г.
Создание и выполнение потоков
Цель работы
Изучение создания, контроля и завершения потоков в ОС Linux. Знакомство с функциями ОС Linux, относящимся к работе с потоками.
Общие сведения
Поток – это “полупроцесс”, который имеет свой собственный стек и выполняет заданную часть кода. В отличие от обычных процессов потоки обычно разделяют свою память с другими потоками. В составе процесса может быть запущено несколько потоков, которые выполняются параллельно (или квазипараллельно - в режиме разделения времени процессора). Можно считать (и в некоторых операционных системах это действительно так), что в любом процессе имеется по крайней мере один поток – главный. Это тот поток, в котором выполняется функция main.
Главный поток может порождать другие потоки. В программе процесса поток имеет вид процедуры/функции, которая вызывается специальным системным вызовом и после вызова выполняется параллельно с запустившим ее потоком.
Главная цель использования потоков – реализовать выгоды от потенциальной производительности программы. Если сравнить стоимости создания и управления процесса и потока, то создание потока требует гораздо меньших накладных расходов. Все потоки внутри процесса разделяют одно и то же адресное пространство. Межпотоковое сообщение более эффективно в большинстве случаев и проще, чем межпроцессное сообщение.
Потоковые приложения позволяют получить прирост производительности в следующих случаях:
Одновременное выполнение вычислительной работы и с устройствами ввода-вывода.
Например, программа может иметь участок, где она выполняет длительную операцию ввода-вывода. В то время как один поток ждет завершения операции ввода-вывода, остальные потоки могут интенсивно использовать процессор.
Асинхронная обработка событий. Задачи, которые обрабатывают события с неизвестной частотой и длительностью, могут выполняться параллельно. Например, веб-сервер может в одном потоке передавать данные по запросу, а в другом – ожидать новые запросы.
Многопоточные приложения работают как на однопроцессорных системах, так и на многопроцессорных без перекомпиляции, используя во втором случае все преимущества многопроцессорной обработки.
Функции управления потоками
Функция pthread_create используется для того, чтобы создать новый поток, функция
pthread_exit используется для завершения потока, а функция pthread_join – для ожидания завершения другого потока. Данные функции объявлены в файле
<pthread.h>.
Функцияint pthread_create
(
pthread_t * threadhandle, /* Thread handle returned by reference */
pthread_attr_t *attribute, /* Special Attribute for starting thread, may
be NULL */
void *(*start_routine)(void *), /* Main Function which thread executes */
void *arg /* An extra argument passed as a pointer */
);
ОписаниеЗапрос к библиотеке на создание нового потока. Возвращаемое значение равно нулю в случае успеха. В случае неуспешного выполнения возвращаемое значение отрицательное. phread_ – это абстрактный тип данных для идентификации потока.
Функцияvoid pthread_exit
(
void *retval /* return value passed as a pointer */
);
ОписаниеЭта функция используется для инициации завершения потока.
Возвращаемое значение передается в виде указателя. Значение указателя может быть любым (в пределах размера типа sizeof(void *), что системно зависимо). Как вариант можно передавать адрес структуры данных, если возвращаемое значение очень большое.
Функцияint pthread_join
(
pthread_t threadhandle, /* Pass threadhandle */
void **returnvalue /* Return value is returned by ref. */
);
ОписаниеОжидание завершения другого потока, заданного параметром
threadhandle. Возвращает ноль в случае успешного завершения или отрицательное в противном случае. Возвращаемое значение – указатель, возвращенный по ссылке. Если не нужны возвращаемые значения, то можно передать NULL в качестве второго аргумента.
Инициализация потоков
Для включения поддержки потоков в программе необходимо:
Включить заголовочный файл <pthread.h>
Объявить переменную типа pthread_t: pthread_t the_thread
При компиляции использовать опцию компоновщика pthread:
gcc threads.c –o threads –lpthread
Сначала потоки создаются изнутри процесса. После того, как созданы эти потоки, они становятся равноправными и могут создавать другие потоки. Начальный поток в процессе – это поток, выполняющий функцию main.
Завершение потоков
int pthread_cancel(pthread_thread);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.