Создать ключ данных с функцией-деструктором (TLS)
#include <pthread.h>int pthread_key_create( pthread_key_t *key,void (*destructor)( void * ) );
pthread_key_t
объект, где функция может хранить созданный ключ.NULL
или указатель на функцию-деструктор ключа.libc
Функция pthread_key_create() создает потоко-специфичный ключ данных (TLS), который доступен всем потокам процесса и присоединяет к нему опциональную функцию-деструктор (destructor). Если функция завершается успешно, новый ключ возвращается в параметре key.
Несмотря на то, что ключ может быть использован всеми потоками, в каждом из них с ключом мгут быть ассоциированы уникальные данные с помощью pthread_setspecific(). Ассоциация существует все время жизни потока. |
При создании ключа во всех потоках с ключом ассоциируется NULL
. При создании потока всем определенным ключам назначается значение NULL
.
При необходимости, вы можете назначить каждому ключу деструктор destructor. Он вызывается при завершении потока и при значении ключа не равным NULL
. Его аргументом будет являться значение ключа. Порядок вызова деструкторов для разных ключей не определен.
Если после всех вызовов функции destructor остаются ключи с не-NULL
значениями, деструктор вызывается повторно максимум PTHREAD_DESTRUCTOR_ITERATIONS
раз для каждого такого значения.
PTHREAD_KEYS_MAX
.Пример демонстрирует способ использования потоко-специфичных данных (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 системной библиотеки