Б.2. Основные функции для работы с потоками: создание и завершение

Б.2. Основные функции для работы с потоками: создание и завершение

В этом разделе мы опишем пять основных функций для работы с потоками.

Функция pthread_create

При запуске пpoгрaммы вызовом exec создается единственный поток, называемый начальным потоком, или главным (initial thread). Добавочные потоки создаются вызовом pthread_create:

#include <pthread.h>

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */

Каждый поток процесса обладает собственным идентификатором потока, который имеет тип pthread_t. При успешном создании нового потока его идентификатор возвращается через указатель tid.

Каждый поток обладает некоторым количеством атрибутов: приоритетом, начальным размером стека, признаком демона и т. п. При создании потока эти атрибуты могут быть указаны с помощью переменной типа pthread_attr_t, значение которой имеет более высокий приоритет, чем значения по умолчанию. Обычно мы используем значения по умолчанию. При этом аргумент attr является нулевым указателем.

Наконец, при создании потока мы должны указать функцию, которую он будет выполнять, — начальную функцию потока (thread start function). Поток запускается вызовом этой функции и завершается либо явно (вызовом pthread_exit), либо неявно (возвратом из этой функции). Адрес функции указывается в аргументе func, и вызывается она с единственным аргументом — указателем arg. Если функции нужно передать несколько аргументов, следует упаковать их в структуру и передать ее адрес в качестве единственного аргумента начальной функции.

Обратите внимание на объявления func и arg. Функция принимает один аргумент — указатель типа void, и возвращает один аргумент — такой же указатель. Это дает нам возможность передать потоку указатель на что угодно и получить в ответ такой же указатель.

Функции Posix для работы с потоками обычно возвращают 0 в случае успешного завершения работы и ненулевое значение в случае ошибки. В отличие от большинства системных функций, возвращающих –1 в случае ошибки и устанавливающих значение errno равным коду ошибки, функции Pthread возвращают положительный код ошибки. Например, если pthread_create не сможет создать новый поток из-за превышения системного oгрaничeния на потоки, эта функция вернет значение EAGAIN. Функции Pthread не устанавливают значение переменной errno. Несоответствий при их вызове не возникает, поскольку ни один из кодов ошибок не имеет нулевого значения (<sys/errno.h>).

Функция pthread_join

Мы можем ожидать завершения какого-либо процесса, вызвав pthread_join. Сравнивая потоки с процессами Unix, можно сказать, что pthread_create аналогична fork, a pthread_join — waitpid:

#include <pthread.h>

int pthread_join(pthread_t tid, void **status);

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */

Мы должны указать идентификатор потока, завершения которого ожидаем. К сожалению, невозможно задать режим ожидания завершения нескольких потоков (аналога waitpid с идентификатором процесса –1 нет).

Если указатель status ненулевой, возвращаемое потоком значение (указатель на объект) сохраняется в ячейке памяти, на которую указывает status.

Функция pthread_self

У каждого потока имеется свой идентификатор, уникальный в пределах данного процесса. Идентификатор возвращается pthread_create и используется при вызове pthread_join. Поток может узнать свой собственный идентификатор вызовом pthread_self:

#include <pthread.h>

pthread_t pthread_self(void);

/* Возвращает идентификатор вызвавшего потока */

Вызов pthread_self является аналогом getpid для процессов Unix.

Функция pthread_detach

Поток может являться как присоединяемым (по умолчанию), так и отсоединенным. При завершении присоединяемого потока его идентификатор и статус завершения сохраняются до тех пор, пока какой-либо другой поток данного процесса не вызовет pthread_join. Отсоединенный поток функционирует аналогично процессу-демону. После его завершения все ресурсы освобождаются. Никакой другой поток не может ожидать его завершения. Если имеется необходимость ожидания одним потоком завершения другого, лучше оставить последний присоединяемым.

Функция pthread_detach делает данный поток отсоединенным:

#include <pthread.h>

int pthread_detach(pthread_t tid);

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх в случае ошибки */

Эта функция вызывается потоком при необходимости изменить собственный статус в форме

pthread_detach(pthread_self());

Функция pthread_exit

Одним из способов завершения потока является вызов pthread_exit:

#include <pthread.h>

void pthread_exit(void *status);

/* ничего не возвращает вызвавшему потоку */

Если поток не является отсоединенным, его идентификатор и статус завершения сохраняются для возвращения другому потоку, который может вызвать pthread_join.

Указатель status не должен быть установлен на локальный объект вызвавшего потока (типа автоматической переменной), поскольку этот объект уничтожается при завершении потока.

Поток может быть завершен двумя другими способами:

? начальная функция потока (третий аргумент pthread_create) может вызвать return. Поскольку эта функция должна объявляться как возвращающая указатель на тип void, это возвращаемое значение становится статусом завершения потока;

? функция main процесса может завершить работу или один из потоков может вызвать exit или _exit. При этом процесс завершает работу немедленно, вместе со всеми своими потоками.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.5. Завершение работы системы Linux

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

3.5. Завершение работы системы Linux Хотя компьютер, работающий под управлением ОС Linux, при выполнении некоторых условий можно оставлять работающим круглосуточно, большинство пользователей персональных компьютеров привыкли выключать их после завершения работы. Если вы


Завершение работы

Из книги Реестр Windows автора Климов Александр

Завершение работы Выключить компьютер можно двумя способами - Используя команду Выключение меню кнопки Пуск- Открывая окно Диспетчер задач Windows нажатием кнопок Ctrl+Alt+Del и выбирая пункт меню Завершение работы | Выключение Windows позволяет запретить выключение этими


Завершение работы

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Завершение работы Для завершения работы с компьютером под управлением Windows Vista по умолчанию предлагается совершенно новый способ – переход в режим сна. Для перевода компьютера в этот режим щелкните на кнопках Пуск, а затем Выключение. В результате текущий сеанс работы


3.4. Завершение работы системы

Из книги Тонкости реестра Windows Vista. Трюки и эффекты автора Клименко Роман Александрович

3.4. Завершение работы системы Зависшие программы В этом разделе мы рассмотрим несколько трюков, с помощью которых можно регулировать работу с зависшими программами.Время зависания программыВозможности реестра позволяют изменять промежуток времени, по истечении


Сохранение и завершение работы

Из книги AutoCAD 2009 автора Орлов Андрей Александрович

Сохранение и завершение работы Для сохранения документа нажмите кнопку Save (Сохранить) на панели быстрого доступа либо на панели инструментов Standard (Стандартная). Можно также выполнить команду меню File ? Save (Файл ? Сохранить). На экране появится диалоговое окно Save Drawing As


Завершение работы

Из книги Реестр Windows автора Климов А

Завершение работы Выключить компьютер можно двумя способами• Используя команду Завершение работы меню кнопки Пуск• Открывая окно Завершение работы программы нажатием кнопок ctrl+alt+del и нажимая кнопку Завершить работуWindows позволяет запретить выключение этими способами


Завершение работы Windows

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин

Завершение работы Windows События, происходящие в приложениях Delphi при завершении работы Windows Я провел небольшое исследование, и вот что я выяснил:При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:1. FormCloseQuery –


1.3. Завершение работы в Microsoft Word

Из книги AutoCAD 2010 автора Орлов Андрей Александрович

1.3. Завершение работы в Microsoft Word Окно программы Microsoft Word имеет те же элементы, что и другие окна в операционной системе Windows, поэтому завершать работу с программой вы можете привычными способами. Существует несколько вариантов закрытия программы:• нажать кнопку Office,


Сохранение и завершение работы

Из книги Основы информатики: Учебник для вузов автора Малинина Лариса Александровна

Сохранение и завершение работы Для сохранения документа нажмите кнопку Save (Сохранить) на панели быстрого доступа либо на панели инструментов Standard (Стандартная). Можно также выполнить команду меню File ? Save (Файл ? Сохранить). На экране появится диалоговое окно Save Drawing As


4.2. Начало и завершение работы

Из книги Системное программирование в среде Windows автора Харт Джонсон М

4.2. Начало и завершение работы Для работы в Windows 2000 необходимо иметь учетную запись, состоящую из имени пользователя и пароля. Учетная запись пользователя создается администратором. Затем ей назначаются разрешения, определяющие возможность доступа к файлам, папкам и


Дополнительные функции управления потоками

Из книги Видеосамоучитель создания реферата, курсовой, диплома на компьютере автора Баловсяк Надежда Васильевна

Дополнительные функции управления потоками Несмотря на то что функций управления потоками, которые мы выше обсуждали, вполне достаточно для большинства случаев, в том числе и для примеров, приведенных в этой книге, в Windows XP и Windows Server 2003 были введены две дополнительные


2.12. Завершение работы с файлом

Из книги Ubuntu 10. Краткое руководство пользователя автора Колисниченко Д. Н.

2.12. Завершение работы с файлом В версии текстового редактора Word 2007 появилась новая функция – завершение работы с файлом. Выбрав в меню кнопки Office пункт Подготовить, вы получите доступ к операциям, которые разработчики предлагают выполнить перед тем как документ станет


2.4. Начало работы и ее завершение

Из книги Операционная система UNIX автора Робачевский Андрей М.

2.4. Начало работы и ее завершение После запуска система отобразит окно (рис. 2.18) для ввода имени пользователя и пароля (если при установке системы вы не выбрали опцию Входить в систему автоматически). Введите те данные, которые вы указали при установке системы, и перед вами


Основные системные функции для работы с файлами

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Основные системные функции для работы с файлами В табл. 2.7 приведены основные системные функции работы с файлами, являющиеся образами системных вызовов в программе С.Функции более высокого уровня, предлагаемые стандартной библиотекой ввода/вывода, которые в конечном


26.2. Основные функции для работы с потоками: создание и завершение потоков

Из книги автора

26.2. Основные функции для работы с потоками: создание и завершение потоков В этом разделе мы рассматриваем пять основных функций для работы с потоками, а в следующих двух разделах мы используем эти функции для написания потоковой модификации клиента и сервера