Читать «UNIX: взаимодействие процессов» онлайн - страница 323
Уильям Ричард Стивенс
Потоки помогают решить обе проблемы. Часто они называются «облегченными процессами» (lightweight processes), поскольку поток проще, чем процесс. Создание потока может занимать по времени меньше одной десятой создания процесса.
Все потоки одного процесса совместно используют его глобальные переменные, поэтому им легко обмениваться информацией, но это приводит к необходимости синхронизации. Однако общими становятся не только глобальные переменные. Все потоки одного процесса разделяют:
■ инструкции процесса;
■ большую часть данных;
■ открытые файлы (дескрипторы);
■ обработчики сигналов и вообще настройки для работы с сигналами;
■ текущий рабочий каталог;
■ идентификатор пользователя и группы.
Однако каждый поток имеет свои собственный:
■ идентификатор потока;
■ набор регистров, включая PC и указатель стека;
■ стек (для локальных переменных и адресов возврата);
■ errno;
■ маску сигналов;
■ приоритет.
Б.2. Основные функции для работы с потоками: создание и завершение
В этом разделе мы опишем пять основных функций для работы с потоками.
Функция pthread_create
При запуске пpoгрaммы вызовом exec создается единственный поток, называемый начальным потоком, или главным (initial thread). Добавочные потоки создаются вызовом pthread_create:
#include <pthread.h>
int pthread_create(pthread_t *
/* Возвращает 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Каждый поток процесса обладает собственным идентификатором потока, который имеет тип pthread_t. При успешном создании нового потока его идентификатор возвращается через указатель
Каждый поток обладает некоторым количеством атрибутов: приоритетом, начальным размером стека, признаком демона и т. п. При создании потока эти атрибуты могут быть указаны с помощью переменной типа pthread_attr_t, значение которой имеет более высокий приоритет, чем значения по умолчанию. Обычно мы используем значения по умолчанию. При этом аргумент
Наконец, при создании потока мы должны указать функцию, которую он будет выполнять, — начальную функцию потока (thread start function). Поток запускается вызовом этой функции и завершается либо явно (вызовом pthread_exit), либо неявно (возвратом из этой функции). Адрес функции указывается в аргументе
Обратите внимание на объявления