Создать поток
#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()).
 | Атрибуты, измененные в структуре уже после создания потока на сам поток никак не влияют. |
- start_routine
- Потоковая функция с которой будет начинать исполнение созданный поток. Ее единственным аргументом является arg. Если в потоке происходит возврат управления из start_routine(), то будет неявно вызвана функция pthread_exit(), используя возвращенное значение в качестве статуса завершения потока.
Поток main() ведет себя иначе. При возвращении управления из main() неявно вызывается exit(), используя возвращенное значение в качестве статуса завершения процесса.
- arg
- Аргумент потоковой функции start_routine.
libc
Функция pthread_create() создает новый поток с указанными в attr атрибутами. Новый поток наследует маску сигналов родителя, но список активных сигналов будет являться пустым.
 | - Вы должны вызвать функцию pthread_join() или pthread_detach() для созданных потоков, имеющих атрибут detachstate в значении
PTHREAD_CREATE_JOINABLE (устанавливается по умолчанию). В противном случае не все системные ресурсы будут освобождены при их завершении.
- Если установлено поле __stacksize структуры attr, то фактический размер стека будет округлен вверх кратно размеру системной страницы (см. константу
_SC_PAGESIZE в sysconf()) если стек будет создаваться системой (в случае, если поле __stackaddr структуры attr равно NULL ). Если же стек нового потока создан приложением, то изменить его размер таким способом невозможно. |
Расширения ЗОСРВ «Нейтрино»
Если придерживаться стандарта POSIX, существует ряд атрибутов, которые нельзя определить до создания потока:
- Отключить точки остановки в потоке.
- Установить тип остановки (cancellation) потока.
- Нельзя определить поведение при доставке сигнала в поток.
Функций 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 );
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 системной библиотеки