Вот кусок FreeBSDшного man pthread:
PER-THREAD CONTEXT ROUTINES
int pthread_key_create(pthread_key_t *key, void (*routine)(void *))
Create a thread-specific data key.
int pthread_key_delete(pthread_key_t key)
Delete a thread-specific data key.
void * pthread_getspecific(pthread_key_t key)
Get the thread-specific value for the specified key.
int pthread_setspecific(pthread_key_t key, const void *value_ptr)
Set the thread-specific value for the specified key.Люди, объясните - что это за data key и чем он такой особенный?
Я просто чувствую, что это может понадобиться для решения стояшей передо мной задачи, но не могу разобраться - что это.
Маны непосредственно по функциям я прочитал, но это ничего не прояснило.Буду очень благодарен, если мне кто-нить по-русски объяснит - что это такое.
>Вот кусок FreeBSDшного man pthread:
>PER-THREAD CONTEXT ROUTINES
> int pthread_key_create(pthread_key_t *key, void (*routine)(void *))
>
> Create a thread-specific data key.
>
> int pthread_key_delete(pthread_key_t key)
>
> Delete a thread-specific data key.
>
> void * pthread_getspecific(pthread_key_t key)
>
> Get the thread-specific value for
>the specified key.
> int pthread_setspecific(pthread_key_t key, const void *value_ptr)
>
> Set the thread-specific value for
>the specified key.
>
>Люди, объясните - что это за data key и чем он такой
>особенный?
>Я просто чувствую, что это может понадобиться для решения стояшей передо мной
>задачи, но не могу разобраться - что это.
>Маны непосредственно по функциям я прочитал, но это ничего не прояснило.
>
>Буду очень благодарен, если мне кто-нить по-русски объяснит - что это такое.
>В отличие от процессов, все потоки делят одно адресное пространство.
Тем не менее у каждого потока свой собственный стеквызова.
При каждом вызове функции в любом потоке создаются свои локальные переменные, которые сохраняются в стеке этого потока.
Иногда все же требуется продублировать глобальную переменную, чтобы у каждого потока была ее собственная копия, с этой целью вам предоставляется ОБЛАСТЬ ПОТОКОВЫХ ДАННЫХ. Все переменные из потоковых данных должны иметь тип void*, ссылка на каждую переменную осуществляется по ключу, для создания нового ключа, т.е. новой переменной используется функция pthread_key_create().
>В отличие от процессов, все потоки делят одно адресное пространство.
>Тем не менее у каждого потока свой собственный стеквызова.
>При каждом вызове функции в любом потоке создаются свои локальные переменные, которые
>сохраняются в стеке этого потока.
>Иногда все же требуется продублировать глобальную переменную, чтобы у каждого потока была
>ее собственная копия, с этой целью вам предоставляется ОБЛАСТЬ ПОТОКОВЫХ ДАННЫХ.
>Все переменные из потоковых данных должны иметь тип void*, ссылка на
>каждую переменную осуществляется по ключу, для создания нового ключа, т.е. новой
>переменной используется функция pthread_key_create().Спасибо, но не совсем понятно. Давайте на примере, чем отличаются следующие функции?:
1)
void* tread_function (void *arg)
{
void *ptr;
ptr = malloc (50);
free (ptr);
return NULL;
}
///////////
2)
/* где-то там в программе */
pthread_key_t *key; // глобальная переменная
pthread_key_create (key, NULL);
/* функция потока */
void* tread_function (void *arg)
{
void *ptr;
ptr = malloc (50);
pthread_setspecific (key, ptr);
free (ptr);
return NULL;
}
/////////////
Кстати - память для key - выделяет функция или самому надо?
>>В отличие от процессов, все потоки делят одно адресное пространство.
>>Тем не менее у каждого потока свой собственный стеквызова.
>>При каждом вызове функции в любом потоке создаются свои локальные переменные, которые
>>сохраняются в стеке этого потока.
>>Иногда все же требуется продублировать глобальную переменную, чтобы у каждого потока была
>>ее собственная копия, с этой целью вам предоставляется ОБЛАСТЬ ПОТОКОВЫХ ДАННЫХ.
>>Все переменные из потоковых данных должны иметь тип void*, ссылка на
>>каждую переменную осуществляется по ключу, для создания нового ключа, т.е. новой
>>переменной используется функция pthread_key_create().
>
>Спасибо, но не совсем понятно. Давайте на примере, чем отличаются следующие функции?:
>
>1)
>void* tread_function (void *arg)
>{
> void *ptr;
> ptr = malloc (50);
> free (ptr);
> return NULL;
>}
>///////////
>2)
>/* где-то там в программе */
>pthread_key_t *key; // глобальная переменная
>pthread_key_create (key, NULL);
>/* функция потока */
>void* tread_function (void *arg)
>{
> void *ptr;
> ptr = malloc (50);
> pthread_setspecific (key, ptr);
> free (ptr);
> return NULL;
>}
>/////////////
>Кстати - память для key - выделяет функция или самому надо?зачем делать malloc ? это вообще неправильно ..
а ptr - переменная локализованная в функции, поэтому она вне конкуренции ..
key - глобальная переменная .. вот и вся разница
>Кстати - память для key - выделяет функция или самому надо?самому ничего не надо :))
А можно встречный вопрос ? Как это может быть ?:)
``Я не знаю что это, но чувствую, что это мне понадобится ...'' :))
странно ..
>>Кстати - память для key - выделяет функция или самому надо?
>
>самому ничего не надо :))
>А можно встречный вопрос ? Как это может быть ?:)
>``Я не знаю что это, но чувствую, что это мне понадобится ...''
>:))
>странно ..Нет ничего тут странного, между рочим. Можно ответить "Интуиция", например.
Вообще, к подобным ощущениям очень важно внимательно относиться.
У нейропсихолога лучше спросить почему.