URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1403
[ Назад ]

Исходное сообщение
"pthread_key_create... - что это, и с чем это едят?"

Отправлено David , 15-Фев-03 19:22 
Вот кусок 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 и чем он такой особенный?
Я просто чувствую, что это может понадобиться для решения стояшей передо мной задачи, но не могу разобраться - что это.
Маны непосредственно по функциям я прочитал, но это ничего не прояснило.

Буду очень благодарен, если мне кто-нить по-русски объяснит - что это такое.


Содержание

Сообщения в этом обсуждении
"RE: pthread_key_create... - что это, и с чем это едят?"
Отправлено Nekto , 15-Фев-03 21:52 
>Вот кусок 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().


"RE: pthread_key_create... - что это, и с чем это едят?"
Отправлено David , 16-Фев-03 18:19 
>В отличие от процессов, все потоки делят одно адресное пространство.
>Тем не менее у каждого потока свой собственный стеквызова.
>При каждом вызове функции в любом потоке создаются свои локальные переменные, которые
>сохраняются в стеке этого потока.
>Иногда все же требуется продублировать глобальную переменную, чтобы у каждого потока была
>ее собственная копия, с этой целью вам предоставляется ОБЛАСТЬ ПОТОКОВЫХ ДАННЫХ.
>Все переменные из потоковых данных должны иметь тип 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 - выделяет функция или самому надо?


"RE: pthread_key_create... - что это, и с чем это едят?"
Отправлено Nekto , 16-Фев-03 21:29 
>>В отличие от процессов, все потоки делят одно адресное пространство.
>>Тем не менее у каждого потока свой собственный стеквызова.
>>При каждом вызове функции в любом потоке создаются свои локальные переменные, которые
>>сохраняются в стеке этого потока.
>>Иногда все же требуется продублировать глобальную переменную, чтобы у каждого потока была
>>ее собственная копия, с этой целью вам предоставляется ОБЛАСТЬ ПОТОКОВЫХ ДАННЫХ.
>>Все переменные из потоковых данных должны иметь тип 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 - глобальная переменная .. вот и вся разница


"RE: pthread_key_create... - что это, и с чем это едят?"
Отправлено Nekto , 16-Фев-03 21:30 
>Кстати - память для key - выделяет функция или самому надо?

самому ничего не надо :))
А можно встречный вопрос ? Как это может быть ?:)
``Я не знаю что это, но чувствую, что это мне понадобится ...'' :))
странно ..



"RE: pthread_key_create... - что это, и с чем это едят?"
Отправлено SergeiZz , 18-Фев-03 19:03 
>>Кстати - память для key - выделяет функция или самому надо?
>
>самому ничего не надо :))
>А можно встречный вопрос ? Как это может быть ?:)
>``Я не знаю что это, но чувствую, что это мне понадобится ...''
>:))
>странно ..

Нет ничего тут странного, между рочим. Можно ответить "Интуиция", например.
Вообще, к подобным ощущениям очень важно внимательно относиться.
У нейропсихолога лучше спросить почему.