pthread_create()

Создать поток

Прототип:

#include <pthread.h>
int pthread_create( pthread_t *thread,
const pthread_attr_t *attr,
void * (*start_routine)( void * ),
void *arg );

Аргументы:

thread
NULL или указатель на объект pthread_t, где функция может хранить идентификатор созданного потока.
attr
Указатель на структуру pthread_attr_t, которая определяет атрибуты нового потока. Вместо прямой записи полей этой структуры следует использовать функции pthread_attr_init() и pthread_attr_set_*(). Если attr равен NULL, то будут использоваться атрибуты по умолчанию (см. pthread_attr_init()).

Note: Атрибуты, измененные в структуре уже после создания потока на сам поток никак не влияют.

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

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

Библиотека:

libc

Описание:

Функция pthread_create() создает новый поток с указанными в attr атрибутами. Новый поток наследует маску сигналов родителя, но список активных сигналов будет являться пустым.


Note:
  • Вы должны вызвать функцию pthread_join() или pthread_detach() для созданных потоков, имеющих атрибут detachstate в значении PTHREAD_CREATE_JOINABLE (устанавливается по умолчанию). В противном случае не все системные ресурсы будут освобождены при их завершении.

  • Если установлено поле __stacksize структуры attr, то фактический размер стека будет округлен вверх кратно размеру системной страницы (см. константу _SC_PAGESIZE в sysconf()) если стек будет создаваться системой (в случае, если поле __stackaddr структуры attr равно NULL). Если же стек нового потока создан приложением, то изменить его размер таким способом невозможно.

Расширения ЗОСРВ «Нейтрино»

Если придерживаться стандарта POSIX, существует ряд атрибутов, которые нельзя определить до создания потока:

Функций pthread_attr_set_*() для этих атрибутов не существует.

В качестве расширений стандарта ЗОСРВ «Нейтрино» предлагает следующие флаги, которые можно через побитовое OR определить в поле __flags структуры pthread_attr_t перед вызовом pthread_create():

PTHREAD_CANCEL_ENABLE (по умолчанию)
Запросы на остановку выполнения потока должны обрабатываться в соответствии с заданным типом остановки.
PTHREAD_CANCEL_DISABLE
Запросы на остановку не доставляются в поток.
PTHREAD_CANCEL_ASYNCHRONOUS
Если остановка потока разрешена, новые запросы на остановку могут быть обработаны немедленно.
PTHREAD_CANCEL_DEFERRED (по умолчанию)
Если остановка потока разрешена, новые запросы на остановку будут обработаны при достижении следующей точки остановки потока (см. "Точка остановки потока" в таблице "Классификация:" в описании соответствующей функции API для определения является ли она точкой остановки потока).
PTHREAD_MULTISIG_ALLOW (по умолчанию согласно POSIX)
Завершение всех потоков процесса при поступлении сигнала в поток.
PTHREAD_MULTISIG_DISALLOW
Завершать только поток, который получил сигнал.

После создания потока эти атрибуты можно переопределить с помощью функций pthread_setcancelstate() и pthread_setcanceltype().

Локальное хранилище потока (Thread Local Storage, TLS)

Каждый поток имеет локальное хранилище или TLS (thread local storage) для хранения потоко-специфичных данных. Получить указатель на эту область данных можно с помощью вызова __tls().

TLS определяется структурой struct _thread_local_storage.

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

EAGAIN
Недостаточно ресурсов для создания нового потока.
EFAULT
При обращении к буферам или start_routine возникла ошибка.
EINVAL
Некорректный объект атрибутов attr.
EOK
Успешное завершение.

Примеры:

Создание потока в состоянии "detached":

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void * function( void *arg )
{
printf( "This is thread %d\n", pthread_self() );
return (0);
}
int main( void )
{
pthread_attr_t attr;
pthread_attr_init( &attr );
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
pthread_create( NULL, &attr, &function, NULL );
/* Allow threads to run for 60 seconds. */
sleep( 60 );
return (EXIT_SUCCESS);
}

Классификация:

POSIX 1003.1 THR

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

struct _thread_local_storage, main(), pthread_attr_init(), pthread_exit(), pthread_setcancelstate(), pthread_setcanceltype(), sysconf(), __tls(), ThreadCreate()




Предыдущий раздел: Описание API системной библиотеки