pthread_key_create()

Создать ключ данных с функцией-деструктором (TLS)

Прототип:

#include <pthread.h>
int pthread_key_create( pthread_key_t *key,
void (*destructor)( void * ) );

Аргументы:

key
Указатель на pthread_key_t объект, где функция может хранить созданный ключ.
destructor
NULL или указатель на функцию-деструктор ключа.

Библиотека:

libc

Описание:

Функция pthread_key_create() создает потоко-специфичный ключ данных (TLS), который доступен всем потокам процесса и присоединяет к нему опциональную функцию-деструктор (destructor). Если функция завершается успешно, новый ключ возвращается в параметре key.


Note: Несмотря на то, что ключ может быть использован всеми потоками, в каждом из них с ключом мгут быть ассоциированы уникальные данные с помощью pthread_setspecific(). Ассоциация существует все время жизни потока.

При создании ключа во всех потоках с ключом ассоциируется NULL. При создании потока всем определенным ключам назначается значение NULL.

При необходимости, вы можете назначить каждому ключу деструктор destructor. Он вызывается при завершении потока и при значении ключа не равным NULL. Его аргументом будет являться значение ключа. Порядок вызова деструкторов для разных ключей не определен.

Если после всех вызовов функции destructor остаются ключи с не-NULL значениями, деструктор вызывается повторно максимум PTHREAD_DESTRUCTOR_ITERATIONS раз для каждого такого значения.

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

EOK
Успешное завершение.
EAGAIN
Недостаточно системных ресурсов для создания ключа или достигнут лимит PTHREAD_KEYS_MAX.
ENOMEM
Недостаточно памяти для создания ключа.

Примеры:

Пример демонстрирует способ использования потоко-специфичных данных (TLS) для предоставления доступа к разным реализациям данных в потоко-безопасной функции:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_key_t buffer_key;
void buffer_key_destruct( void *value )
{
free( value );
pthread_setspecific( buffer_key, NULL );
}
char * lookup( void )
{
char *string;
string = (char *)pthread_getspecific( buffer_key );
if ( string == NULL )
{
string = (char *)malloc( 32 );
sprintf( string, "This is thread %d\n", pthread_self() );
pthread_setspecific( buffer_key, (void *)string );
}
return (string);
}
void *function( void *arg )
{
while ( 1 )
{
puts( lookup() );
}
return (0);
}
int main( void )
{
pthread_key_create( &buffer_key, &buffer_key_destruct );
pthread_create( NULL, NULL, &function, NULL );
/* Let the threads run for 60 seconds. */
sleep( 60 );
return (EXIT_SUCCESS);
}

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

POSIX 1003.1 Threads

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

Предостережения:

Функция pthread_key_create() является частью стандарта POSIX 1003.1-1996. Ее поведение может варьироваться от системы к системы.

Перед вызовом каждого деструктора значение соответствующего ключа устанавливается в NULL. Таким образом, вызов

pthread_setspecific( key, NULL );

в дескрипторе не требуется. Это позволяет использовать один дескриптор для нескольких ключей.

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

pthread_getspecific(), pthread_setspecific(), pthread_key_delete()




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