Потоки в POSIX

Чтобы предоставить возможность создания переносимых многопоточных программ, в отношении потоков институтом IEEE был определен стандарт IEEE standard 1003.1c. Определенный в нем пакет, касающийся потоков, называется Pthreads.
Он поддерживается большинством UNIX-систем. В стандарте определено более 60 вызовов функций. Рассмотреть в этой книге такое количество функций мы не в состоянии. Лучше опишем ряд самых основных функций, чтобы дать представление о том, как они работают. В табл. 2.5 перечислены все вызовы функций, которые мы будем рассматривать.
Таблица 2.5. Ряд вызовов функций стандарта Pthreads


Все потоки Pthreads имеют определенные свойства. У каждого потока есть свои идентификатор, набор регистров (включая счетчик команд) и набор атрибутов, которые сохраняются в определенной структуре. Атрибуты включают размер стека, параметры планирования и другие элементы, необходимые при использовании потока.

Новый поток создается с помощью вызова функции pthread_create. В качестве значения функции возвращается идентификатор только что созданного потока. Этот вызов намеренно сделан очень похожим на системный вызов fork (за исключением параметров), а идентификатор потока играет роль PID, главным образом для идентификации ссылок на потоки в других вызовах.

Когда поток заканчивает возложенную на него работу, он может быть завершен путем вызова функции pthread_exit. Этот вызов останавливает поток и освобождает пространство, занятое его стеком.

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

Иногда бывает так, что поток не является логически заблокированным, но считает, что проработал достаточно долго, и намеревается дать шанс на выполнение другому потоку. Этой цели он может добиться за счет вызова функции pthread_yield. Для процессов подобных вызовов функций не существует, поскольку предполагается, что процессы сильно конкурируют друг с другом и каждый из них требует как можно больше времени центрального процессора. Но поскольку потоки одного процесса, как правило, пишутся одним и тем же программистом, то он добивается от них, чтобы они давали друг другу шанс на выполнение.

Два следующих вызова функций, связанных с потоками, относятся к атрибутам. Функция pthread_attr_init создает структуру атрибутов, связанную с потоком, и инициализирует ее значениями по умолчанию. Эти значения (например, приоритет) могут быть изменены за счет работы с полями в структуре атрибутов.

И наконец, функция pthread_attr_destroy удаляет структуру атрибутов, принадлежащую потоку, освобождая память, которую она занимала. На поток, который использовал данную структуру, это не влияет, и он продолжает свое существование.

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

Листинг 2.1. Пример программы, использующей потоки #include

#include

#include

#define NUMBER_OF_THREADS 10 void *print_hello_world(void *tid)

{

/* Эта функция выводит идентификатор потока, а затем осуществляет выход */ pгintf("Привет, мир. Тебя приветствует поток № %d\n", tid);


pthread_exit(NULL);

int main(int argc, char *argv[])

{

/* Основная программа создает 10 потоков, а затем осуществляет выход. */ pthread_t threads[NUMBER_OF_THREADS]; int status, i;

for(i=0; i < NUMBER_OF_THREADS; i++) {

printfC^™ основная программа. Создание потока № %d\n"", i);

status = pthread_create(&threads[i], NULL, print_hello_world,

(void *)i);

if (status != 0) {

printf("Жаль, функция pthread_create вернула код ошибки %d\n"", status); exit(-1);

}

}

exit(NULL);

}

При создании поток выводит однострочное сообщение, объявляя о своем существовании, после чего осуществляет выход. Порядок, в котором выводятся различные сообщения, не определен и при нескольких запусках программы может быть разным.

Конечно же описанные функции Pthreads составляют лишь небольшую часть многочисленных функций, имеющихся в этом пакете. Чуть позже, после обсуждения синхронизации процессов и потоков, мы изучим и некоторые другие функции.

2.2.4.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Потоки в POSIX:

  1. коян: Восходящий узел - включение в общий поток; Нисходящий узел - исключение из общего потока.
  2. Альбатрос (восхождение на поток)
  3. ТЕОРИЯ ПОТОКА СОЗНАНИЯ
  4. 3.9. ПОТОК СОЗНАНИЯ
  5. ПОТОК СОЗНАНИЯ
  6. 2.2.1. Поток образов
  7. Глава 3. ОТКРОЙТЕ СВОЙ ПОТОК ОБРАЗОВ
  8. 12.2.1. Групповой поток образов
  9. МИХАЙ ЧИКСЕНТМИХАЙИ. В ПОИСКАХ ПОТОКА, 2015
  10. 13.5.1. Игра в поток образов
  11. 2.7. КАК ВЫЗВАТЬ ПОТОК ОБРАЗОВ
  12. 3.10. ТИПИЧНЫЙ ПОТОК ОБРАЗОВ
  13. 12.3.2. Сценарий группового потока образов
  14. 4.16. ПОТОК ОБРАЗОВ - ЭТО НЕ ГИПНОЗ
  15. 6.14. ЧТО, ЕСЛИ ПОТОК ОБРАЗОВ ГОВОРИТ "НЕТ"?
  16. 6.2.7. Шаг шестой : последние самое - самое лучшее