Знакомство с функциями ОС Linux, относящимися к работе с потоками

Страницы работы

Содержание работы

Лабораторная работа №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);

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
61 Kb
Скачали:
0