Выбрать главу

[EINVAL]  новое значение, заданное для атрибута, не попадает в диапазон значений, действительных для этого атрибута. Эти функции не возвращают код ошибки [EINTR].

Примеры

Отсутствуют.

Замечания по использованию

Отсутствуют.

Логическое обоснование

Отсутствует.

Будущие направления

Отсутствуют.

Смотри также

pthread_create (), pthread_cond_destroy (), pthread_condattr_destroy (), pthread_mutex_destroy (), то м Base Definidons стандарта IEEE Std 1003.1-2001, <pthread.h>.

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение м POSIX Threads Extension.

Issue 6

Функции pthread_condattr_getpshared () и pthread_condattr_setpshared () от м ечены как часть опций Threads и Thread Process-Shared Synchronization.

В целях согласования со стандартом ISO/IEC 9899: 1999 в прототип функции pthread_condattr_getpshared () было добавлено ключевое слово restrict.

pthread_create

Имя

pthread_create — функция создания потока.

Синопсис

THR

#include <pthread.h>

int pthread_create (pthread_t *restrict thread, const pthread_attr_t *restrict attr, void * (*start_routine) (void*), void *restrict arg);

Описание

Функция pthread_create() используется для создания в процессе нового потока с атрибутами, заданными параметром attr . Если значение параметра attr равно NULL, используются атрибуты, действующие по умолчанию. Если атрибуты, заданные параметром attr, будут модифицироваться позже, то на атрибуты уже созданного потока это не повлияет. При успешном завершении функция pthread_create () сохраняет ID-значение созданного потока в области памяти, адресуемой параметром thread.

При создании потока выполняется функция start_routine, которая вызывается с единственным аргументом arg . Если функция start_routine выполнится до конца, то результат будет таким, как если бы было сделано явное обращение к функции pthread_exit (), использующей в качестве состояния выхода (exit status) значение, возвращаемое функцией start_routine. Обратите внимание на то, что поток, в котором изначально вызывалась функция main(), отличается от функции start_routine. При выходе из функции main () результат будет таким, как если бы было сделано явное обращение к функции exit (), использующей в качестве состояния выхода значение, возвращаемое функцией main ().

Статус сигналов для нового потока будет инициализирован следующим образом:

• маска сигналов будет унаследована от создающего потока;

• множество необработанных сигналов для нового потока будет пустым.

Среда обработки данных с плавающей точкой будет унаследована от создающего потока.

При неудачном выполнении функции pthread_create () поток не создается, а содержимое области, адресуемое параметром thread, остается неопределенным.

TCT

 Если определено значение _POSIX_THREAD_CPUTIME, новый поток получит доступ к таймеру центрального процессора (CPU-time clock), и начальное значение для этих часов будет установлено равным нулю.

Возвращаемое значение

При успешном завершении функция pthread_create () возвращает нулевое значение; в противном случае — код ошибки, обозначающий ее характер.

Ошибки

Функция pthread_create () завершится неудачно, если:

[EAGAIN] в системе недостаточно ресурсов, необходимых для создания еще одного потока, или был превышен предел ({PTHREAD_THREADS_MAX}), установленный в системе для общего количества потоков в процессе;

[EINVAL] значение, заданное параметром attr , недействительно;

[EPERM] инициатор вызова не имеет соответствующего разрешения на установку требуемых параметров планирования или стратегии планирования.

Эта функция не возвращает код ошибки [EINTR].

Примеры

Отсутствуют.

Замечания по использованию

Отсутствуют.

Логическое обоснование

В качестве альтернативного решения для функции pthread_create () предлагалось определить две отдельные операции: «создать» и «запустить». Для некоторых приложений такое поведение было бы более естественным. В среде Ada, в частности, отделено «создание» задачи от ее «активизации».

Разбиение этой операции на две части разработчиками стандарта было отклонено по нескольким причинам.

• Количество вызовов, требуемых для запуска потока, в этом случае возросло бы от одного до двух, что, таким образом, возложило бы излишние расходы на приложения, которым не нужна дополнительная синхронизация. Однако второго вызова можно было бы избежать за счет усложнения атрибута состояния запуска.